解释我问的最好方法是:
用户可以拥有他们喜欢的foo, 根据需要可以存在多少个栏, 但是用户每个酒吧只能有一个foo。
如何在模型中强制执行此操作?
因为我在控制器中进行了检查,但显然这不是一个好主意,因为这是模型约束,应该在模型上,而不是在控制器中。
答案 0 :(得分:0)
class User < ActiveRecord::Base
has_many :bar
...
end
class Bar < ActiveRecord::Base
belongs_to :user
has_one :foo
...
end
答案 1 :(得分: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错误
但是这几乎强制执行“彼此一个”约束。