Rails孙子对象:has_many,:through

时间:2011-09-12 14:18:52

标签: ruby-on-rails rails-activerecord

我的架构如下:

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 个答案:

答案 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