Frage Rails 3 + activerecord, der beste Weg, um ein einzelnes Feld für alle Datensätze zu "massen", die eine Bedingung erfüllen


In Rails 3, mit activerecord, gibt es eine Single-Abfrage-Möglichkeit, um die :versteckt Feld zu WAHR für alle Datensätze, die eine Bedingung erfüllen ... sagen, zum Beispiel, :condition => [ "phonenum = ?", some_phone_number ]

Wenn eine einzelne Abfrage das nicht kann, was ist der optimale Ansatz?


75
2018-02-06 09:20


Ursprung


Antworten:


Benutzen Alle aktualisieren mit dem optionalen zweiten Parameter für die Bedingung:

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

86
2018-02-06 09:23



Das update_all erlaubt keine Bedingungen in Rails 3. Sie können eine Kombination aus scope und update_all verwenden

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

Referenz: http://m.onkey.org/active-record-query-interface


86
2018-02-06 09:37



Wenn Sie Rückrufe auslösen möchten:

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

Dann:

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

4
2018-01-28 00:03