Rails внуки объекты с: has_many,: through - PullRequest
1 голос
/ 12 сентября 2011

У меня есть схема, структурированная следующим образом:

class Foo < ActiveRecord::Base
  has_many :foo_bars
  has_many :foo_bar_bazs, :through => :foo_bars
end


class FooBar < ActiveRecord::Base
  has_many :foo_bars
  belongs_to :foo_bar
end

Class FooBarBaz < ActiveRecord::Base
  belongs_to :foo_bar
end

Я пытаюсь сделать выбор в модели Foo - как Foo.find (: all).И FooBar, и FooBarBaz имеют правильный столбец внешнего ключа в базе данных (foo_id и foo_bar_id соответственно).Итак, как мне получить доступ к дочерним и внучатым объектам, когда я получаю доступ к объекту прародителя (Foo)?

В конце мне нужно пройти через объекты Foo, затем через объекты Foobar, затем через объекты FoobarBaz, в трех вложенных циклах.

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011

Во-первых, я бы пересмотрел синтаксис в соответствии с соглашением:

class Foo < ActiveRecord::Base
  has_many :foo_bars
  has_many :foo_bar_bazs, :through => :foo_bars
end


class FooBar < ActiveRecord::Base
  has_many :foo_bar_bazs
  belongs_to :foo_bar
end

Class FooBarBaz < ActiveRecord::Base
  belongs_to :pc_scene_item
end

Теперь, когда у нас есть объекты:

Foo.find(:all, :include => [:foo_bars, :foo_bar_bazs])

Теперь: можно избежать сквозного перехода, и выможно сделать:

foos = Foo.find(:all, :include => [{:foo_bars => [:foo_bar_bazs]}])

Чтобы получить всех детей:

children = foos.collect{|f| f.foo_bars}.flatten.uniq

Чтобы получить всех внуков:

grandchildren = foos.collect{|f| f.foo_bars.collect{|b| b.foo_bar_bazs}}.flatten.uniq
0 голосов
/ 12 сентября 2011

Я думаю, что в вашей модели FooBar есть ошибка.Я думаю, что вы намеревались сказать, что он принадлежит Foo, а не FooBar (в настоящее время FooBar принадлежит вам).

Предполагая, что у вас есть все остальные данные и взаимосвязи, вы должны называть его foo.foo_bar

0 голосов
/ 12 сентября 2011

Вы не должны использовать случай верблюда, чтобы назвать свои ассоциации, но случай змеи:

class Foo < ActiveRecord::Base
  has_many :foo_bars
  has_many :foo_bar_bazs, :through => :foo_bars
end

class FooBar < ActiveRecord::Base
  has_many :foo_bar_bazs
  belongs_to :foo
end

class FooBarBaz < ActiveRecord::Base
  belongs_to :foo_bar
end
...