【问题标题】:Associated tables: Join or Include with Rails关联表:加入或包含在 Rails 中
【发布时间】:2012-06-27 03:43:13
【问题描述】:

当谈到 rails 和 Active Record 关联时,我感觉有点慢……我有两个表。

Table = 戒指
Table = Variations with foreign_key => "ring_id"。

class Ring < ActiveRecord::Base
      has_many :variations
end

class Variation < ActiveRecord::Base
      belongs_to :ring
end

所以在我的“索引/列表”视图中,我想显示所有的环,以及两种变体,我认为可以通过一个 SQL 查询来做到这一点......但是,我已经尝试过加入和 include 方法,我想我只是不明白它们是如何正常工作的。

所以我的问题是,我将如何在我的控制器中编写一个查询,从“变量”中提取我的“标题”和“值”列值并将它们组合成一个简单的对象以便于循环?还是我必须遍历所有环并在循环期间查找变化值?

谢谢

【问题讨论】:

    标签: ruby-on-rails join activerecord include


    【解决方案1】:

    在您的控制器中:

    @rings = Ring.includes(:variations).all
    

    在 index.html.erb 中:

    @rings.each do |ring|
      ...
      ring.variations.each do |variation|
        ...
      end
    end
    

    查询的包含部分将防止 Rails 在您循环并在视图中呈现环和变体时重复查询数据库。

    【讨论】:

    • 好。请注意, ring.variations 是这里的关键,因为它通过关联访问数据。包含很好地提高了性能,但没有它查询仍然可以工作。
    • 最好的办法是使用 :delegates 来获取变体信息,但这有点高级(而且设计更好,但不需要)。
    • 所以,当我对我的环对象执行 时,它不会将变化显示为整个对象的一部分。有没有办法显示整个对象以查看组合对象?当我调试它只显示它加入之前的对象...
    【解决方案2】:

    您需要使用includes 方法:Ring.inclues(:variations)。然后,变体将与环一起加载到单个 SQL 查询中。

    欲了解更多信息:http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

    【讨论】:

    • 不,你不需要。它的性能更好,但差别不大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2017-06-06
    • 2013-07-17
    相关资源
    最近更新 更多