Rails 3 + activerecord, найкращий спосіб "масового оновлення" одного поля для всіх записів, які відповідають умові


75

У напрямках 3, використовуючи activerecord, чи існує спосіб одного запиту встановити для поля : hidden значення TRUE для всіх записів, які відповідають умові ... скажімо, наприклад,:condition => [ "phonenum = ?", some_phone_number ]

Якщо за допомогою одного запиту це неможливо, який оптимальний підхід?

Відповіді:


86

Використовуйте update_all з необов’язковим другим параметром для умови:

Model.update_all({ hidden: true }, { phonenum: some_phone_number})

2
Як щодо випадку, коли значення менше певного значення для ex update_all ({: hidden => true}, {: date_created <a_certain_date}), чи це можливо?
ctilley79,

7
@ ctilley79, я думаю, це має спрацювати:Model.where("date_create < ?", a_certain_date).update_all(hidden: true)
Догберт

86

Update_all не допускає умов у рейках 3. Ви можете використовувати комбінацію сфери дії та update_all

Model.where(phonenum: some_phone_number).update_all(hidden: true)

Довідково: http://m.onkey.org/active-record-query-interface


4
Це неправильно . На цій сторінці написано " надання будь-якої опції ", відповідно до абзацу, що знаходиться безпосередньо над списком методів, що описує різні варіанти, які можна використовувати в optionsхеші. Сюди не входить conditionsаргумент щодо update_all().
Ашера

Я згоден, що він помиляється. відповідно до API Avatar.update_all ['migrated_at =?', Time.now.utc], ['migrated_at>?', 1.week.ago] встановить migrated = зараз, де migrated_at знаходиться протягом тижня.
ctilley79,

4
Відповідно до документації щодо rails 4, запропонований вище спосіб справді є правильним шляхом - apidock.com/rails/ActiveRecord/Relation/update_all - # Оновіть усі книги з позначкою "Rails" у назві Book.where ("назва LIKE?", '% Rails%'). Update_all (автор: 'David')
JAR.JAR.beans

5

Якщо ви хочете викликати зворотні дзвінки:

class ActiveRecord::Base
  def self.update_each(updates)
    find_each { |model| model.update(updates) }
  end

  def self.update_each!(updates)
    find_each { |model| model.update!(updates) }
  end
end

Тоді:

Model.where(phonenum: some_phone_number).update_each(hidden: true)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.