2009-09-05 4 views
1

В моем приложении у меня есть группы, которые по существу являются тегами, которые могут быть назначены различным моделям через полиморфные отношения. В модели группы у меня есть:контроллер не делает, что он должен?

def get_members_of(klass) 
    self.group_memberships.delete_if {|gm| gm.groupable_type != klass}.map{|g| g.groupable} 
end 

Так что, если я сделал:

group.group_memberships 

Я хотел бы получить все объекты групповой группы. Однако, если я хочу, чтобы ограничить его только объекты, которые являются экземплярами модели А я хотел бы сделать:

group.get_members_of(A) 

В консоли это работает именно так, как это должно быть. Тем не менее, я получаю некоторое неожиданное поведение в моем контроллере:

def show 
    params[:studies1] = @group.get_members_of('Study').length 
    @studies = @group.get_members_of('Study') 
    params[:studies2] = @studies.length 
    @studies = @group.group_memberships.delete_if {|gm| gm.groupable_type != "Study"}.map{|g| g.groupable} 
    params[:studies3] = @studies.length 
end 

Как и ожидалось Params [: studies1] == 1, но исследований2 и 3 == 0. Я уверен, что не хватает какой-то мелочь. ..

+0

Почему вы настройки Params в контроллере? – jonnii

+0

Грязный способ увидеть значения каждой переменной, например, printf. – LDK

+1

Простой способ отладки - использовать logger.error, а затем tail -f ваш журнал. –

ответ

0

Функция get_members_of глубоко испорчена! Когда вызывается get_members_of, удаляются все остальные члены из group.group_memberships, которые не относятся к классу. Когда функция вызывается дополнительные времена для других «klasses», там не осталось group_members ...

Это работает, но выглядит убого:

def get_members_of(klass) 
    x = [] 
    self.group_memberships.each {|gm| x << gm if gm.groupable_type == klass } 
    x.map{|g| g.groupable} 
    end 
+1

'self.group_memberships.inject ([]) {| m, el | m << el if el.groupable_type == klass} .map (&: groupable) 'является одним лайнером. –

+0

Как работает «&: groupable» часть? – LDK

+0

Это символ # to_proc –