Атрибут обновления 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')
Другие вопросы по тегам