как обновить update_attributes с условиями? - PullRequest
2 голосов
/ 04 августа 2010

Мне нужно обновить атрибуты, но только для строк с конкретными условиями, такими как

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

Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 04 августа 2010

Это зависит от того, хотите ли вы выполнить массовое обновление 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.

1 голос
/ 15 марта 2016

Вы также можете выполнить массовое обновление SQL, используя условия where, которые я считаю более удобочитаемыми.

Model.where(recipient_id: current_user.id)
     .where(inbox_id: @inbox.id)
     .where(status: 'unread')
     .update_all("attr1='something_new'")
0 голосов
/ 04 августа 2010
Model.update_all("foo='bar'", "recipient_id = #{current_user.id} and inbox_id = #{@inbox.id} and status='unread'")
...