0

我有两个通过 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'”错误。

我查看了命名范围以通过标记结果获取项目,但似乎人们正在远离这种方法,转而支持类方法。真的吗?

4

1 回答 1

1

在您的项目模型上,您需要将其添加到类而不是实例中。另请注意,这会将 self 对象提升到类,因此您可以消除“项目”。除非你想明确。

class << self
  def by_tag(tag_id)
    joins(:tasks => :tags).where(:tags => {:id = tag_id})
  end
end

关于什么是最好的方法总是存在争议。我自己更喜欢任何能更快完成工作的方法。我个人喜欢范围,但每个人都喜欢。

于 2012-07-22T20:36:03.810 回答