2011-01-24 117 views
1

此代码应通过应用过滤器,以它的“名字”值更新整个表:Ruby on Rails的ActiveRecord的效率

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的规定 - 在一次Select的需要,只有当它一排(每个周期),而不是所有条目。

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

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

回答

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

提取所有条目(每个查询100条)并公开每个条目以供您享受。

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

相关问题