您好,我想问一下哪个更好,如果两者都不是好的方法,那么迭代嵌套模型的最佳方法是什么。
方法 # 1。
@categories = Category.all
@categories.each do |category|
category.sub_categories.each do |sub_category|
puts sub_category.name
end
end
假设我有 100 个类别,每个类别包含 100 个子类别,因此此方法将生成 100x100 个查询
方法 #2。
@categories = Category.all
@sub_categories = SubCategory.all
@categories.each do |category|
@sub_categories.each do |sub_category|
if category.id == sub_category.category_id
puts sub_category.name
end
end
end
只有 2 个查询,但会迭代“@sub_categories”100 次。
我想知道哪个更好?
最佳答案
第一个肯定更好,特别是因为您可以使用 Rails' eager loading以减少查询。
这是我要做的:
#controller
@categories = Category.includes(:sub_categories)
#view, haml-style
%ul
- @categories.each do |category|
%li
%h2= category.name
%ul
- category.sub_category.each do |sub_category|
%li= sub_category.name
为什么这样更好?
- 使用 Rails 预加载减少查询:上面的 Controller 行最多运行 2 个查询
- 更简单、更清晰的代码
- 您要避免在 View /输出中使用复杂、不必要的代码来检查
category.id == sub_category.category_id
的匹配。
关于第二个例子的进一步说明
假设您有 10 个类别,每个类别有 10 个子类别,总共 100 个。第一个示例将在 @category
上进行 10 次迭代,每次在 includes(:sub_categories)
上进行 10 次迭代,(这是模糊数学)总共 110 次“数组迭代”。
第二个示例将在 @category
上进行 10 次迭代,每次在 @sub_categories
上进行 100 次迭代,(再次模糊数学)总共 1010 次“数组迭代”。这绝对更糟。
关于ruby-on-rails - 在 Rails 中迭代嵌套对象的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20571386/