在Rails 4中查找一组深层嵌套子对象的所有父对象的父对象

时间:2015-11-20 15:50:14

标签: ruby-on-rails ruby-on-rails-4 has-many

这可能听起来令人困惑,但很容易解释。让我们说我有3个深度嵌套的模型:

//boo.rb
class Boo < ActiveRecord::Base
  has_many :foos
end

//foo.rb
class Foo < ActiveRecord::Base
  belongs_to :boo
  has_many :goos
end

//goo.rb
class Foo < ActiveRecord::Base
  belongs_to :foo
end

现在,如果我在@goos中获得了一组Goos,是否有可能以精益方式获得所有连接的Foos?我正在使用这个atm,但它不是很精简,因为我只在第一步得到了id而不是对象本身:

@goos.pluck(:foo_id)

如果有更好的方法可以做到这一点,是否还有一种方法可以让所有父母都联系到Foos?这样我就可以将所有Boos的一组连接到@goos中的对象?

希望这个问题不是太奇怪,但我不确定是否有技术术语!

1 个答案:

答案 0 :(得分:2)

像这样工作:

#Get all Foos
@foos = @goos.map(&:foo).compact.uniq

#Get all Boos
@boos = @goos.map(&:foo).map(&:boo).compact.uniq

虽然它并不是很好,但它会返回一个数组而不是一个有效的记录关系,这意味着我无法在其上调用whereorder

编辑:

如果由于某种原因保留活动记录关系类很重要,这是更好的方法:

#Get all Foos
@foos = Foo.where(id: @goos.map(&:foo.id).uniq)

#Get all Boos
@boos = Boo.where(id: @goos.map(&:foo).map(&:boo_id).uniq)