update_attribute ничего не делает после first_or_create, если запись не существует ранее - PullRequest
0 голосов
/ 04 июня 2019

Я делаю оператор first_or_create, за которым следует update_attributes:

hangout = Hangout.where(tour: tour, guide: current_user).first_or_create
hangout.update_attributes(priority: current_user.priority)

Если запись уже существует, она обновляет приоритет.Если он не существует ранее, обновления нет.Почему?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2019
  def update_attributes!(attributes)
    self.attributes = attributes
    save!
  end

обновить атрибут с помощью bang. Вызвать сохранение с bang.

def save!(*args, &block)
  create_or_update(*args, &block) || raise(RecordNotSaved.new("Failed to save the record", self))
end

Внутри сохранения! RecordNotSave возникнет ошибка, если не удастся сохранить запись.

, чтобы вы могли настроить обработку ошибок из своего кода.

begin
    hangout.update_attributes!(priority: current_user.priority)
rescue RecordNotSaved => e
    #do the exception handling here
end
0 голосов
/ 04 июня 2019

update_attributes (он же update) возвращает логическое значение, указывающее, была ли ошибка, если вы ее не проверяли - используйте bang-версию update!, чтобы исключение не игнорировалось.

Скорее всего, запись не создается из-за проверки.Также, когда вы обновляете новую запись сразу после создания - лучше использовать first_or_create(priority: current_user.priority) или first_or_initialize (с последующим обновлением), чтобы сэкономить дополнительную запись в БД.

...