Можно ли сделать двойной has_many: через ассоциацию в рельсах? - PullRequest
4 голосов
/ 08 марта 2011

У меня четыре модели: а, б, в, д

вот что я хочу сделать:

a has_many b, :through => c
a has_many d, :through => b

так что в консоли я могу тогда сделать:

a.b
a.b.first.d
a.d

в настоящее время первые две команды работают, но в третьей я получаю ошибку SQL. похоже, он пытается пройти через b, чтобы получить d, и не замечает того факта, что a -> b проходит через c.

Как решить?

Ответы [ 2 ]

12 голосов
/ 19 сентября 2013

Быстрое обновление этого для всех, кто сталкивался с этим, это возможно после Rails 3.1: http://guides.rubyonrails.org/3_1_release_notes.html

В вашем примере, вот как это будет выглядеть:

Class A
  has_many :c
  has_many :b, :through => :c, :source => :b
  has_many :d, :through => :b, :source => :d
end

Class C
  has_many :b
  has_many :d, :through => :b, :source => :d
end    

Class B
  has_many :d
end

Class D

end

Просто чтобы уточнить!

5 голосов
/ 08 марта 2011

Я не думаю, что вы можете позвонить a.d напрямую, но вы можете сделать a.b.map(&:d).flatten, чтобы получить все d из a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...