【问题标题】:Ruby on Rails ActiveRecord efficiencyRuby on Rails ActiveRecord 效率
【发布时间】:2011-01-24 11:55:28
【问题描述】:

此代码应通过对其“名称”值应用过滤器来更新整个表:

entries = select('id, name').all
entries.each do |entry|
  puts entry.id
  update(entry.id, { :name => sanitize(entry.name) })
end

我对 Ruby on Rails 很陌生,发现它很有趣,我的选择查询被拆分为单行选择:

SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 1) LIMIT 1
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 2) LIMIT 1
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 3) LIMIT 1
...

据我了解,这是 Rails 提供的一种优化 - 仅在需要时(每个周期)选择一行,而不是一次选择所有条目。

但是,在这种情况下真的更有效吗?我的意思是,如果我的数据库表中有 1000 条记录 - 进行 1000 次查询比单个查询更好吗?如果没有,我如何强制 Rails 每个查询选择多于一行?

另一个问题是:并非所有行都被此查询更新。如果提供的值与已经存在的值相同(换句话说,如果 entry.name == sanitize(entry.name)),Rails 是否会忽略更新查询?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    ActiveRecord 是一个抽象层,但在执行某些操作时(尤其是那些涉及大型数据集的操作),了解抽象层下面发生的事情很有用。

    这对于所有抽象来说几乎都是正确的。 (参见 Joel Spolsky 关于泄漏抽象的经典文章:http://www.joelonsoftware.com/articles/LeakyAbstractions.html

    为了处理这里的例子,Rails 提供了update_all 方法

    【讨论】:

      【解决方案2】:
      Entry.find_each do |entry|
        #...
      end
      

      获取所有条目(每个查询 100 个)并公开每个条目以供您取乐。

      如果属性没有改变,Rails 将不会执行UPDATE 查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-09
        • 2014-11-14
        相关资源
        最近更新 更多