【发布时间】: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