2011-10-07 28 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注入攻击;或者是安全的并使用散列。