ruby-on-rails - 在 Rails 中迭代嵌套对象的最佳方法是什么

标签 ruby-on-rails ruby

您好,我想问一下哪个更好,如果两者都不是好的方法,那么迭代嵌套模型的最佳方法是什么。

方法 # 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

为什么这样更好?

  1. 使用 Rails 预加载减少查询:上面的 Controller 行最多运行 2 个查询
  2. 更简单、更清晰的代码
  3. 您要避免在 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/

相关文章:

html - 使用 sass 覆盖 <td> 的 <tr> 样式

ruby - 在 Ruby 中,有没有办法打印出所有定义/预定义的全局变量和常量?

ruby-on-rails - 处理重复的数据库条目

ruby-on-rails - 从 rails 3.2.12 更改为 3.2.13 时,是什么导致极度缓慢

ruby-on-rails - 在 ActiveAdmin 中创建一个自定义字符串过滤器,默认包含并且不显示字符串过滤器选项下拉列表 - Formtastic & Ransack

ruby-on-rails - ActiveRecord::DangerousAttributeError:卡住?由 Active Record 定义

ruby - 使用 step 遍历数组

ruby-on-rails - 在 Rails 3.1 中更改 created_at 的格式?

ruby-on-rails - 为什么 Ruby on Rails 在编辑代码后会虚假地引发 0​​x104567910?

ruby-on-rails - [尝试部署] : You must use Bundler 2 or greater with this lockfile