尝试定义引用其他模型的方法失败

列表有许多recsrecs属于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和记录,您可以在该模型中看到。 Listsrecs属于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对象,它调用标准行为(在这种情况下没有。)