私が求めていることを説明する最良の方法は次のとおりです。
ユーザーは好きなだけ foo を持つことができ、必要な数のバーが存在できますが、ユーザーはバーごとに 1 つの foo しか持つことができません。
モデルでこれを強制するにはどうすればよいですか?
私はコントローラーでチェックを行ったが、これはコントローラーではなくモデル上にあるべきモデル制約であるため、明らかに良い考えではありません。
私が求めていることを説明する最良の方法は次のとおりです。
ユーザーは好きなだけ foo を持つことができ、必要な数のバーが存在できますが、ユーザーはバーごとに 1 つの foo しか持つことができません。
モデルでこれを強制するにはどうすればよいですか?
私はコントローラーでチェックを行ったが、これはコントローラーではなくモデル上にあるべきモデル制約であるため、明らかに良い考えではありません。
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つずつ」という制約をほぼ強制します。