【问题标题】:Best practice for an ActiveRecord object that updates another ActiveRecord object on save保存时更新另一个 ActiveRecord 对象的 ActiveRecord 对象的最佳实践
【发布时间】:2010-12-15 05:36:01
【问题描述】:

这是我的情况:我有两个 ActiveRecord 模型:

class SomeAction < ActiveRecord::Base
  has_one :moderation
end

class Moderation < ActiveRecord::Base
  belongs_to :some_action
end

当我保存与其关联的审核时,我希望审核将 SomeAction 的状态属性更新为“完成”。如果由于某种原因对 SomeAction 的更新不成功,我希望不保存审核。我知道我应该在 before_save 回调中执行此操作,但是返回 false(在意识到 SomeAction 记录不可更新之后)不会回滚所有内容。任何想法

【问题讨论】:

    标签: ruby-on-rails activerecord callback


    【解决方案1】:

    您想使用 :autosave 自动为您验证关联的模型。

    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.rbRails documentation 中的更多信息

    【讨论】:

      【解决方案2】:

      确保您的表支持事务(即 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
      

      【讨论】:

        猜你喜欢
        • 2010-12-04
        • 2013-04-13
        • 1970-01-01
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        • 1970-01-01
        相关资源
        最近更新 更多