2

我需要更新属性,但仅适用于具有特定条件的行,例如

["recipient_id = ? and inbox_id = ? and status='unread'", current_user.id, @inbox.id]

我该怎么做?

4

3 回答 3

4

这取决于您是要进行批量 SQL 更新,还是对每个还调用验证和正常回调链的模型进行更新。
如果要实例化对象并运行回调链,请执行以下操作:

Model.find(:all, :conditions => ["recipient_id = ? and inbox_id = ? and status='unread'", current_user.id, @inbox.id]).each do |obj|
  obj.update_attributes(...)
end

如果要进行 SQL 更新:

Model.update_all("attr1='something', attr2=true,...",  ["recipient_id = ? and inbox_id = ? and status='unread'", current_user.id, @inbox.id])

确保使用数组形式的条件来确保正确转义 SQL。

于 2010-08-04T04:37:01.587 回答
1

您还可以使用where条件进行批量 SQL 更新,我发现它更具可读性。

Model.where(recipient_id: current_user.id)
     .where(inbox_id: @inbox.id)
     .where(status: 'unread')
     .update_all("attr1='something_new'")
于 2016-03-15T16:00:33.947 回答
0
Model.update_all("foo='bar'", "recipient_id = #{current_user.id} and inbox_id = #{@inbox.id} and status='unread'")
于 2010-08-04T04:09:13.690 回答