存在し、コレクション内のオブジェクトを追加するとき、私は、私は、ユーザーにユーザーがすでにフォロワーのコレクション内に存在するときに例外をキャッチしたいと思います< <レイズ例外すでに
current_user.followers<<users
でコレクションにオブジェクトを追加しています。どうやってやるの?
ありがとうございます。
PS。 「< <」と入力してGoogleで検索するのは本当に難しいですが、このメソッドを呼び出す名前はありますか?
存在し、コレクション内のオブジェクトを追加するとき、私は、私は、ユーザーにユーザーがすでにフォロワーのコレクション内に存在するときに例外をキャッチしたいと思います< <レイズ例外すでに
current_user.followers<<users
でコレクションにオブジェクトを追加しています。どうやってやるの?
ありがとうございます。
PS。 「< <」と入力してGoogleで検索するのは本当に難しいですが、このメソッドを呼び出す名前はありますか?
<<
は、left shift operator
と呼ばれますが、コレクションのコンテキストでは、オブジェクトをコレクションに挿入するために使用されます。あなたはユーザークラスのインスタンスメソッドを介して挿入することにより解決を図ることができ
、
class User < ActiveRecord::Base
def add_follower(follower)
raise "Duplicate follower" if followers.include?(follower)
followers << follower
end
end
あなたが信者協会の<<
メソッドをオーバーライドすることができます。また、:push
と:concat
も:<<
のエイリアスであるため、それらもオーバーライドする必要があります。 これは、フォロワーがすでに存在する場合にエラーを発生させるために、オーバーライドされた関連付けメソッドに入れるべき定義です。
class User < ActiveRecord::Base
has_many :followers do
def <<(*records)
result = true
load_target if @owner.new_record?
transaction do
flatten_deeper(records).each do |record|
raise_on_type_mismatch(record)
raise 'Record Already Exists' if @owner.send(@reflection.name).exists? record
add_record_to_target_with_callbacks(record) do |r|
result &&= insert_record(record) unless @owner.new_record?
end
end
end
result && self
end
alias_method :push, :<<
alias_method :concat, :<<
end
end
あなたはbefore_addコールバックを使用することができます代わりにuniqのオプション:
has_many :followers,
:through => :whatever,
:uniq => true
(参加モデルあなたは単にあなたが使用することができ、重複を無視しようとしている場合
has_many :followers,
:through => :whatever,
:before_add => Proc.new { |user, follower|
raise "Duplicate follower" if user.followers.include?(follower)
}
をテーブルには重複が含まれますが、無視されます)。
flatten_deeperが定義されていません。私はあなたがhttps://gist.github.com/1399762からコードを使用したと思います – Matthew