此代码应通过对其“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是否会忽略更新查询?
答案 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
查询。