2011-10-07 38 views

回答

25

您正在尋找update_allSee doc

請注意,這種方式不會引發回調。

+0

謝謝,這是比循環遍歷每個元素更有效的方法。 – Ryan

+1

@瑞安它更有效率,但缺乏回調使我很難選擇我的經驗。最常見的用例之一(除了在開發中清理數據等)是批量啓用/禁用實體。通常,這樣的數據更新值得通知您的用戶,我通常通過回調進行通知;) –

34

這應該工作

Notification.all.each do |n| n.update_attribute(:email, true); end 

編輯:做定製從布里克:

Notification.all.each { |n| n.update_attribute(:email, true) } 
+2

'Notification.all.each {| n | n.update_attribute(:email,true)}' - 分號不屬於Ruby。 ;) – bricker

+0

'Notification.all.each {| n | n.update_attribute:email,true}' 也沒有額外的括號。 ;)(你也可以不用分號來使用'do ... end'形式,因爲'end'(幾乎)從不含糊:'Notification.all.each do | n | n.update_attribute:email,true end' - 但沒有語法突出顯示,這是不太可讀。) –

+1

如果你有多個語句,你必須使用分號,我只是習慣了這種方式。 – cbron

12

您可以使用:

Notification.update_all(email: true) 

如果您有任何的條件來更新你應該使用:

Notification.find_each { |n| n.email = (n.id > 100) ? true : false } 

使用Something.all對於大型數據庫表來說是個壞主意。

+0

一些參考http://api.rubyonrails.org/classes/ActiveRecord/Batches.html – makhan

4
Notification.update_all(email: true) 

是基本答案。

你不需要通過編寫自己的程序塊來「循環」本身:你可以讓主動記錄爲你做出辛苦的工作 - 這裏是一個你有一個ID數組的地方的例子,你想要更新他們的電子郵件(我基本上採取了直接從我的控制器之一本示例):

@notifications = Notification.where(id: [1,2,3,2,1,2]).update_all(email: true) 

編輯:人們注意SQL注入不包括PARAMS [:notification_ids]在您的「這裏」方法與原字符串沒有逃脫或者你會遭受SQL注入攻擊;或者是安全的並使用散列。

相關問題