通过Rails中的自定义查询关联的记录

时间:2012-07-22 20:11:04

标签: ruby-on-rails-3 activerecord

我有两个通过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结果,但似乎人们正在逐渐采用这种方法来支持类方法。这是真的吗?

1 个答案:

答案 0 :(得分:1)

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

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

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