-1

解释我在问什么的最好方法是:

用户可以拥有任意数量的 foo,可以存在任意数量的 bar,但用户每个 bar 只能有一个 foo。

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

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

4

2 回答 2

0

像这样:

class User < ActiveRecord::Base

has_many :bar

...

end

class Bar < ActiveRecord::Base

belongs_to :user
has_one :foo

...

end
于 2013-09-24T14:33:55.960 回答
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

它通过检查 user_id 和 bar_id 的范围来检查链接栏条目的范围,以检查它们之间是否存在链接,如果存在链接,则用户对该特定“栏”有一个“foo”,因此新条目获胜'不被创建(它会出错)

至少我是这么理解的,也许懂的人比我能解释得更好,但它正是我想要它做的。

您必须确保在验证之前设置了 bar_id,否则会出现 nil 错误

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

于 2013-09-25T10:58:45.920 回答