我有一个合作伙伴模型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关联而没有命名范围?
答案 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
这极大地简化了我的查询和集合。我希望你找到问题的答案,这是一个艰难的问题!