Атрибут обновления Rails в модели
Я хочу обновить :position_status
в модели на основе, если :position_date
который равен Date.today
Позвольте сказать, что у меня есть :position_date
который Mon, 26 Oct 2017
хранится в базе данных, если Date.today
на эту конкретную дату, затем обновите :position_status
Я пытался изменить position_date
на сегодняшний день, чтобы увидеть, будет ли он обновляться или нет, но :position_date
не был обновлен.
attr_accessor :update_position_status
def update_position_status
if Date.today == self.position_date
self.update_attribute(:position_status => 'Filled')
end
end
2 ответа
update_attribute(имя, значение) http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html
update_attribute
обновляет отдельный атрибут и пропускает проверки. update_attributes
принимает хэш атрибутов и выполняет проверки.
Таким образом, исправленный код будет:
def update_position_status!
update_attribute(position_status: 'Filled') if self.position_date.today?
end
Имя должно заканчиваться на !
так как он мутирует (изменяет) объект.
Однако обновление записей по одной не является особенно масштабируемым решением. Вместо этого вы хотите выбрать все записи по дате и выполнить массовое обновление:
# MySQL
Thing.where("DATE(position_date)=CURDATE()")
.update_all(position_status: 'Filled')
# Postgres
Thing.where("date_trunc('day', position_date) = current_date()")
.update_all(position_status: 'Filled')
Да update_attribute
требует двух аргументов.
Правильный синтаксис:
self.update_attribute(:position_status, 'Filled')