2011-12-06 10 views
4

update_attributesでvalidation_contextを指定するにはどうすればよいですか?validation_context&update_attributes

私は2つの(update_attributesなし)操作使用していることを行うことができます。

my_model.attributes = { :name => '123', :description => '345' } 
my_model.save(:context => :some_context) 

答えて

5

はここ

def update(attributes) 
    with_transaction_returning_status do 
    assign_attributes(attributes) 
    save 
    end 
end 

updateの別名である)update_attributesのコードがだ、それを行うための方法はありません見ての通り、saveメソッドに引数を渡すことなく、指定された属性を割り当てて保存するだけです。

これらの操作は、アサイメント内のデータを変更する問題を防ぐために、with_transaction_returning_statusに渡されたブロックに囲まれています。したがって、手動で呼び出すと、これらの操作をより安全に囲みます。

一つの簡単なトリックは、このようなあなたのモデルに文脈依存のパブリックメソッドを追加することです:

def strict_update(attributes) 
    with_transaction_returning_status do 
    assign_attributes(attributes) 
    save(context: :strict) 
    end 
end 

あなたは右のあなたのApplicationRecord(Railsの5内のすべてのモデルの基底クラス)にupdate_with_contextを追加することによって、それを改善することができます。コードは次のようになります:

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 

    # Update attributes with validation context. 
    # In Rails you can provide a context while you save, for example: `.save(:step1)`, but no way to 
    # provide a context while you update. This method just adds the way to update with validation 
    # context. 
    # 
    # @param [Hash] attributes to assign 
    # @param [Symbol] validation context 
    def update_with_context(attributes, context) 
    with_transaction_returning_status do 
     assign_attributes(attributes) 
     save(context: context) 
    end 
    end 
end 
関連する問題