用户可以拥有许多“食物”,但每个“酒吧”只有一个

时间:2013-09-24 14:26:17

标签: ruby-on-rails ruby activerecord

解释我问的最好方法是:

用户可以拥有他们喜欢的foo, 根据需要可以存在多少个栏, 但是用户每个酒吧只能有一个foo。

如何在模型中强制执行此操作?

因为我在控制器中进行了检查,但显然这不是一个好主意,因为这是模型约束,应该在模型上,而不是在控制器中。

2 个答案:

答案 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错误

但是这几乎强制执行“彼此一个”约束。