В rails 2.3 как я могу получить коллекцию объектов из ассоциации has_many второго порядка? - PullRequest
1 голос
/ 08 июня 2011

У меня есть модель Партнера, у которой есть_and_belongs_to_many Проекты, в то время как у каждого Проекта есть_ Сайты.Я хочу получить все сайты для данного партнера (и на данный момент меня не интересуют проекты между ними). ​​

Я выполнил то, что мне нужно, с помощью named_scope в модели сайта и проекта.sites.Метод экземпляра, который оборачивает вызов сайта с именем scope, следующим образом:

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}"
    }
  }

end

Теперь, учитывая экземпляр партнера, я могу вызвать partner.sites и получить обратно коллекциювсе сайты, связанные с партнером.Это именно то поведение, которое я хочу, но мне интересно, есть ли другой способ сделать это, используя только ассоциации activerecord, без названной области видимости?

1 Ответ

1 голос
/ 20 июня 2011

У меня была похожая проблема с глубоким вложением запросов / сборов (мне пришлось угрожать повторить данные, прежде чем кто-нибудь ответит на мои 4 вопроса, умно): Уместно ли повторять данные в моделях, чтобы удовлетворить закону деметрыв коллекциях?

Хитрость в том, что этот драгоценный камень 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

Это упростило мои запросы и коллекции.Надеюсь, вы найдете ответ на свой вопрос, он сложный!

...