2012-02-06 10 views
1

存在し、コレクション内のオブジェクトを追加するとき、私は、私は、ユーザーにユーザーがすでにフォロワーのコレクション内に存在するときに例外をキャッチしたいと思います< <レイズ例外すでに

current_user.followers<<users 

でコレクションにオブジェクトを追加しています。どうやってやるの?

ありがとうございます。

PS。 「< <」と入力してGoogleで検索するのは本当に難しいですが、このメソッドを呼び出す名前はありますか?

答えて

1

<<は、left shift operatorと呼ばれますが、コレクションのコンテキストでは、オブジェクトをコレクションに挿入するために使用されます。あなたはユーザークラスのインスタンスメソッドを介して挿入することにより解決を図ることができ

class User < ActiveRecord::Base 
    def add_follower(follower) 
    raise "Duplicate follower" if followers.include?(follower) 
    followers << follower 
    end 
end 
7

あなたが信者協会の<<メソッドをオーバーライドすることができます。また、: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 
+0

flatten_deeperが定義されていません。私はあなたがhttps://gist.github.com/1399762からコードを使用したと思います – Matthew

2

あなたは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) 
     } 

をテーブルには重複が含まれますが、無視されます)。

関連する問題