Наилучшая практика для объекта ActiveRecord, который обновляет другой объект ActiveRecord при сохранении - PullRequest
0 голосов
/ 15 декабря 2010

вот моя ситуация: у меня есть две модели ActiveRecord:

class SomeAction < ActiveRecord::Base
  has_one :moderation
end

class Moderation < ActiveRecord::Base
  belongs_to :some_action
end

Я бы хотел, чтобы модерация обновила атрибут состояния SomeAction до "завершено", когда я сохраняю модерацию, связанную с ним. Я хотел бы, чтобы модерация НЕ сохранялась, если по какой-то причине обновление SomeAction было неудачным. Я знаю, что должен делать это в обратном вызове before_save, однако возвращение false (после того, как выяснилось, что запись SomeAction не была обновляемой) не будет ROLLBACK все. Любой иде

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Вы хотите использовать: автосохранение, которое автоматически проверит ассоциированную модель для вас.

class SomeAction < ActiveRecord::Base
  has_one :moderation
end

class Moderation < ActiveRecord::Base
  belongs_to :some_action, :autosave => true

  before_validation do |moderation|
    moderation.some_action.complete # Changes state
  end

  # autosave kicks in and validates the associated record
  # If validation for some_action fails, the error messages will be pulled up in Moderation
end

Дополнительная информация в activerecord / lib / active_record / autosave_association.rb или Рельсовая документация

1 голос
/ 15 декабря 2010

Убедитесь, что ваша таблица поддерживает транзакции (например, MySQL InnoDB), затем выполните следующие действия:

class Moderation < ActiveRecord::Base
  belongs_to :some_action

  def do_save
    transaction do
      some_action.status = 'complete'
      some_action.save!
      save!
    end
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...