2011-01-24 54 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查詢。

相關問題