在rails 2.3中,如何从二阶has_many关联中检索对象集合?

时间:2011-06-08 01:52:42

标签: ruby-on-rails activerecord associations has-many

我有一个合作伙伴模型has_and_belongs_to_many项目,而每个项目都有很多网站。我想检索给定合作伙伴的所有网站(目前我对之间的项目不感兴趣)。

我已经通过Site模型上的named_scope和一个project.sites实例方法完成了我需要的工作,该方法包含对Site命名范围的调用,如下所示:

class Partner < ActiveRecord::Base

  has_and_belongs_to_many :projects

  def sites
    Site.for_partner_id(self.id)
  end

end


class Project < ActiveRecord::Base

  has_many :sites

end


class Site < ActiveRecord::Base

  belongs_to :project

  named_scope :for_partner_id, lambda {|partner_id|
    { :include=>{:project=>:partners},
      :conditions=>"partners.id = #{partner_id}"
    }
  }

现在,给定合作伙伴实例,我可以调用partner.sites并获取与合作伙伴关联的所有网站的集合。这正是我想要的行为,但我想知道是否还有另一种方法可以使用仅使用activerecord关联而没有命名范围?

1 个答案:

答案 0 :(得分:1)

我在这里有一个类似的深嵌套查询/收集问题(我不得不威胁重复数据,然后才会有人回答我的4个问题,聪明): Is it appropriate to repeat data in models to satisfy using law of demeter in collections?

诀窍就是这个宝石http://rubygems.org/gems/nested_has_many_through可以这样做:

class Author < User
  has_many :posts
  has_many :categories, :through => :posts, :uniq => true
  has_many :similar_posts, :through => :categories, :source => :posts
  has_many :similar_authors, :through => :similar_posts, :source => :author, :uniq => true
  has_many :posts_of_similar_authors, :through => :similar_authors, :source => :posts, :uniq => true
  has_many :commenters, :through => :posts, :uniq => true
end

class Post < ActiveRecord::Base
  belongs_to :author
  belongs_to :category
  has_many :comments
  has_many :commenters, :through => :comments, :source => :user, :uniq => true
end

这极大地简化了我的查询和集合。我希望你找到问题的答案,这是一个艰难的问题!