繁体   English   中英

Ruby on Rails ActiveRecord的效率

[英]Ruby on Rails ActiveRecord efficiency

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

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为每个查询选择多个行?

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

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

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

为了解决这里的问题,Rails提供了update_all方法

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

这将获取所有条目(每个查询100个),并为您的乐趣公开每个条目。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM