2

現在、私のコントローラーでは、ユーザーが一度に複数の「リンク」を送信できます。それらを配列に収集し、そのユーザー用に作成しますが、ユーザーが戻って修正できるようにエラーをキャッチします。そのユーザーに対して既に存在するリンクの作成を無視するにはどうすればよいですか? そのユーザーのスコープで validates_uniqueness_of を使用できることはわかっていますが、作成を完全に無視したいと思います。これが私のコントローラーです:

@links = params[:links].values.collect{ |link| current_user.links.create(link) }.reject { |p| p.errors.empty? }

各リンクには URL があるため、そのユーザーの link.url が既に存在するかどうかを確認することを考えましたが、それを行う方法や場所がよくわかりませんでした。どういうわけかこれをコントローラーに付けるべきですか?それとも、before_validation コールバックのように、モデル内の新しいメソッドにする必要がありますか? (注: これらの「リンク」はネストされていませんが、所属先は :user です。)

したがって、可能であれば、これらのリンクの作成を無視できるようにしたいと考えています。たとえば、ユーザーが 5 つのリンクを送信したが、そのうちの 2 つが既に存在している場合、残りの 3 つが作成されている間、それらの 2 つを無視したいと思います。これを行うにはどうすればよいですか?

編集:Kandadaのおかげで、私は今これを使用しています:

@links = params[:links].values.collect.reject{ |リンク| current_user.links.exists?(:url=>リンク[:url])}

@links = @links.collect{ |リンク| current_user.links.create(link) }.reject { |p| p.errors.empty? }

そこで、まず存在するものがあるかどうかを確認し、次に拒否されなかったものを作成するために、2 つを分離しました。おそらく2つのステートメントを組み合わせるとパフォーマンスが向上するなど、これを行うためのより良い方法はありますか? それさえなければ、十分満足だと思います。(神田さん、jさん、ありがとうございました。)

4

2 に答える 2

2

これを試して:

@links = current_user.links.create(params[:links].reject{ |link| 
           current_user.links.exists?(:url=>link[:url]) })

または、属性のLinkモデルに一意性チェックを追加できます。url

class Link
  validates_uniqueness_of :url, :scope => [:user_id]
end

コントローラーで:

@links = current_user.links.create(params[:links])

返される結果セットは、新しく作成されたLinkオブジェクトの配列です。既存のリンクと一致するリンクはすべて無視されます。

編集

1 つのパスでこれを行う別の方法を次に示します。

@links = params[:links].map{|link| 
           !current_user.links.exists?(:url=> link[:url]) and
             current_user.links.create(link)}.select{|link| link and 
               link.errors.empty?}

独自の検証を機能させ、後でこのコードを使用する必要があると思います。

@links = current_user.links.create(params[:links]).select{|link| 
           link.errors.empty?}

後者のアプローチでは、一意性の検証はモデルで行われます。これにより、リンクの作成方法に関係なく、リンク URL の一意性が保証されます。

于 2010-04-01T19:22:27.653 に答える
1

作成する前に既存のリンクを拒否します。

new_links = params[:links].reject{ |link| current_user.links.exists?(link) }

なんかこう思う。このコードについてはわかりません...

于 2010-04-01T19:06:10.840 に答える