如何根据条件更新属性?

发布于 2024-09-12 13:44:35 字数 157 浏览 3 评论 0原文

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

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

我该如何做?

I need to update attributes but only for rows with the specific conditions like

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

How do I do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

强者自强 2024-09-19 13:44:35

这取决于您是否想要进行批量 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。

It depends on if you want to do a bulk SQL update, or do an update on each model that also calls validation and the normal callback chain.
If you want to instantiate the objects and run the callback chain do:

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

If you want to do the SQL update:

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

Make sure to use the array form of conditions to ensure you correctly escape your SQL.

绅士风度i 2024-09-19 13:44:35

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

Model.where(recipient_id: current_user.id)
     .where(inbox_id: @inbox.id)
     .where(status: 'unread')
     .update_all("attr1='something_new'")

You can also do the bulk SQL update using where conditions, which I find to be more readable.

Model.where(recipient_id: current_user.id)
     .where(inbox_id: @inbox.id)
     .where(status: 'unread')
     .update_all("attr1='something_new'")
苍暮颜 2024-09-19 13:44:35
Model.update_all("foo='bar'", "recipient_id = #{current_user.id} and inbox_id = #{@inbox.id} and status='unread'")
Model.update_all("foo='bar'", "recipient_id = #{current_user.id} and inbox_id = #{@inbox.id} and status='unread'")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文