【问题标题】:Rails select all children of childrenRails 选择子项的所有子项
【发布时间】:2015-07-31 09:44:53
【问题描述】:

我的S班有很多A班有很多B。

我可以为我的 S (S.As) 获得所有 A 我可以遍历这个数组并为每个 A 获取 B。

类似

S.As.each do |aa| 
    aa.Bs
end 

如果不使用“each”,我怎样才能做到这一点?

【问题讨论】:

  • 这对您有帮助吗:S.A.map(&:B) 只会返回 B 的。

标签: ruby-on-rails activerecord children


【解决方案1】:

这将在没有each 的情况下在一行中工作

S.As.collect(&:Bs)

【讨论】:

  • 我认为他想在没有each 的情况下获得输出,我已经回答了.. @mark 请如果你能重新阅读
  • 是的,所以你应该向我建议这个,而不是说这不是一个答案。不过我会更新答案。已经给出了相当的答案。从来没有想过会因为声明而被否决。
  • 请注意,collect 像这样使用会返回一个嵌套数组。假设S.As.size == 6S.As.each { |a| a.Bs.size }.sum == 20。如果您按上述方式使用 collect,您将获得 S.As.collect(&:Bs).size == 6 并且您需要展平:S.As.collect(&:Bs).flatten.size == 20
【解决方案2】:

如果问题是 N+1 查询,我建议使用includes

现在为每个 As 生成一个新查询以获取它的 Bs。

如果你这样写:

S.As.includes(:Bs).each do |aa| 
    aa.Bs
end 

您将获得更少的查询,因为所有 B 都将被预加载。

在这种情况下,map 和 collect 不会改变任何东西。

【讨论】:

  • 我会选择另一个答案作为正确答案,因为它更准确地回答了我的问题。但肯定会使用你的方法,因为它应该工作得更快。谢谢。
  • @ekiyanov 这是一个记录不多的好方法。
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 2022-01-23
  • 2015-03-03
  • 2016-02-15
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多