我有两个通过has_many / belongs_to关联连接的模型:
Class Project < ActiveRecord::Base
has_many :tasks
end
Class Tasks < ActiveRecord::Base
belongs_to :project
end
每个任务都标有HABTM关系:
Class Tasks < ActiveRecord::Base
belongs_to :project
has_and_belongs_to_many :tags
end
我正在尝试根据标记ID获取项目列表。通过在Project
模型上使用类方法,我可以获得具有特定标记的任务的项目列表:
def by_tag(tag_id)
Project.joins(:tasks => :tags).where(:tags => {:id = tag_id})
end
理想情况下,我希望能够在我的视图中列出给定标记的所有项目及其相关任务。如果我使用像project.tasks
这样的项目的典型查找,我通常可以使用Project.find(1)
获取属于给定项目的任务列表。
但是,当我尝试使用我的新类方法project.tasks
找到的结果Project.by_tag(1)
时,我收到“NoMethodError:Undefined Method'tasks'”错误。
我查看了命名范围以获得Project by Tag结果,但似乎人们正在逐渐采用这种方法来支持类方法。这是真的吗?
答案 0 :(得分:1)
在项目模型上,您需要将其添加到类而不是实例。另请注意,这会将self对象引发到类,因此您可以消除“Project”。除非你想要明确。
class << self
def by_tag(tag_id)
joins(:tasks => :tags).where(:tags => {:id = tag_id})
end
end
关于什么是最好的方法总是存在争议。我自己更喜欢能够更快完成工作的任何事情。我个人喜欢范围,但他自己喜欢范围。