Ruby on Rails ActiveRecord效率

时间:2011-01-24 11:55:28

标签: ruby-on-rails activerecord

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

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是否会忽略更新查询?

2 个答案:

答案 0 :(得分:2)

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

这对于所有抽象都是如此。 (参见Joel Spolsky关于漏洞抽象的经典文章:http://www.joelonsoftware.com/articles/LeakyAbstractions.html

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

答案 1 :(得分:1)

Entry.find_each do |entry|
  #...
end

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

如果未更改属性,Rails将不会执行UPDATE查询。