2017-12-30 48 views
0

最新の 'update'または 'create'にアソシエーションが追加されているかどうかを確認するためにARコールバック(after_save)を使用しようとしています。しかし、私はそれを行う正しい方法を見つけることができないようです。ここで 'create'と 'update'の関連付けを確認してください - Active Record

class Submission < ActiveRecord 
    has_many :notes, inverse_of: :submission, dependent: :destroy 
    accepts_nested_attributes_for :notes, :reject_if => proc { |attributes| attributes['message'].blank? }, allow_destroy: true 
end 

は、私は新しいノートテーブルは更新で追加または作成された場合は、確認したいという方法で私のafter_save

after_save :build_conversation 

...このロジックはありません

def build_conversation 
    if self.notes.any? 
    binding.pry 
    end 
end 

ですノートが存在する可能性があるので、うまくいきます。それにもかかわらず、更新または作成時に新しいメモが追加された場合にのみ、このブロックに入ることができます。

答えて

1

チェックアウトthis post基本的にはinclude ActiveModel::Dirtyをモデルに追加し、after_changeコールバックでif_notes_changedをチェックします。このメソッドはmethod_missingを使用して定義されています。たとえば、name列の場合は、if_name_changedなどを使用できます。古い値と新しい値を比較する必要がある場合は、previous_changesを使用できます。

また、あなたはそうのようなaround_saveを使用することができます。

around_save :build_conversation 

def build_conversation 
    old_notes = notes.to_a # the self in self.notes is unnecessary 
    yield # important - runs the save 
    new_notes = notes.to_a 
    # binding.pry 
end 
関連する問題