我的架构如下:
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对象,在三个嵌套循环中迭代。
答案 0 :(得分:2)
首先,我修改语法以匹配约定:
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
答案 1 :(得分:0)
你不应该使用驼峰案来命名你的联想,而是蛇案:
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
答案 2 :(得分:0)
我认为你的FooBar模型有误。我想你打算说它属于Foo,而不是FooBar(目前你有FooBar属于它自己)。
假设您拥有所有其他数据和关系,您应该可以将其称为foo.foo_bar