尝试定义引用其他模型的方法失败
列表有许多recs
和recs
属于lists
。 我试图在list
模型中定义一个名为“eat_lists_with_to_do_recs”的方法。
我希望这个方法包含LISTS,(1)recs(2)recs where done = false和(3)recs where rec_type =’eats’
出于某种原因,我在下面写的方法不是过滤掉不符合这3个条件的列表。 当我在视图中调用该方法时,它返回的列表中done = TRUE且rec_type不=吃。
其他信息 – 网络中有许多lists
和记录,您可以在该模型中看到。 Lists
和recs
属于network
列表模型
class List < ActiveRecord::Base has_many :recs belongs_to :network def eat_lists_with_to_do_recs recs.where("done = ? AND rec_type = ?", false, 'Eats') end end
Rec模型
class Rec < ActiveRecord::Base belongs_to :network belongs_to :list end
查看(实际代码的第3行是错误的)
附加信息 –
调节器
def index @networks_with_recs = Network.networks_with_recs end
网络模型
class Network < ActiveRecord::Base has_many :recs, through: :lists has_many :lists def self.networks_with_recs recs = joins(:recs) if recs.present? all else nil end end end
问题出在这里:
return nil if recs.blank?
最后,您在视图中的返回值上调用each
值:
network.lists.eat_lists_with_to_do_recs.each do |list|
但是nil
不响应each
,所以在List
没有Recs
的情况下,你的应用程序将引发exception。
解决方案是简单地删除该行:
class List < ActiveRecord::Base has_many :recs belongs_to :network def eat_lists_with_to_do_recs recs.where("done = ? AND rec_type = ?", 'false', 'Eats') end end
在这种情况下, where
会返回一个空集合,这很好,因为在空集合上调用each
集合都不会做任何事情,它只会默默地返回。
这与称为空对象模式的概念有关。 在这种情况下,空集合是Recs
集合的null对象,它调用标准行为(在这种情况下没有。)