2013-09-29 3 views

ответ

4

Поместите следующий код в файле /config/initializers/update_all_with_touch.rb

class ActiveRecord::Relation 

    def update_all_with_touch(updates, conditions = nil, options = {}) 

    now = Time.now 

    # Inject the 'updated_at' column into the updates 
    case updates 
     when Hash; updates.merge!(updated_at: now) 
     when String; updates += ", updated_at = '#{now.to_s(:db)}'" 
     when Array; updates[0] += ', updated_at = ?'; updates << now 
    end 

    update_all_without_touch(updates, conditions, options) 
    end 
    alias_method_chain :update_all, :touch 

end 

Он автоматически добавляет параметр :updated_at => Time.now всякий раз, когда вы используете update_all.

Объяснение:

Это использование сниппет alias_method_chain переопределить значение по умолчанию update_all:

alias_method_chain :update_all, :touch 

Метод update_all заменяется методом update_all_with_touch я определил, и оригинальный update_all переименовывается update_all_without_touch. Новый метод изменяет объект upgrades, чтобы ввести обновление updated_at, а затем вызвать оригинал update_all.

+0

Это решение работает, однако я не понимаю, как именно это работает. Каковы методы update_all_without_updated_at или update_all_with_updated_at? Кроме того, в коде использовались разные форматы update_all, и поскольку такие обновления могут быть хешем или массивом или строкой. Я могу проверить тип и объединить параметр updated_at для хэша, и это работает, но как насчет того, когда его массив или строка? –

+0

@ user523146 Я изменил фрагмент, чтобы обрабатывать String и Arrays, и добавил некоторые объяснения. Обновите файл и перезапустите сервер, чтобы просмотреть изменения. – Baldrick

+0

Я заменил 'with_updated_at' на' with_touch' для уточнения. – Baldrick

1

Вы можете переопределить метод update_all в модели:

def self.update_all(attr_hash) # override method 
    attr_hash[:updated_at] = Time.now.utc 
    super(attr_hash) 
end 
+0

Мне нужно это поведение более чем в одной модели, и, следовательно, я искал метод, который будет работать в разных моделях. –

+0

Итак, добавьте суперкласс класса ActiveRecord и добавьте туда функцию. Он будет доступен для всех ваших моделей. – user2503775

Смежные вопросы