-1

私が求めていることを説明する最良の方法は次のとおりです。

ユーザーは好きなだけ foo を持つことができ、必要な数のバーが存在できますが、ユーザーはバーごとに 1 つの foo しか持つことができません。

モデルでこれを強制するにはどうすればよいですか?

私はコントローラーでチェックを行ったが、これはコントローラーではなくモデル上にあるべきモデル制約であるため、明らかに良い考えではありません。

4

2 に答える 2

0

foo モデルに以下を追加します。

 before_validation :set_bar
 validates :user_id, uniqueness: {  scope:  :bar_id,message: "Only one foo per bar please" }

 def set_bar
   self.bar ||= bar.current
   true
end

リンクされたバーエントリの bar_id のスコープで user_id をチェックして、それらすべての間にリンクが存在するかどうかをチェックすることで機能します。リンクがある場合、ユーザーはその特定の「バー」に対して「foo」を持っているため、新しいエントリが勝ちました作成されません(エラーになります)

少なくともそれが私がそれを理解している方法です。おそらく、より理解のある人は私よりもうまく説明できますが、それはまさに私がやりたいことを行います。

検証する前に bar_id が設定されていることを確認する必要があります。そうしないと、nil エラーが発生します

しかし、それは「1つずつ」という制約をほぼ強制します。

于 2013-09-25T10:58:45.920 に答える