解释我在问什么的最好方法是:
用户可以拥有任意数量的 foo,可以存在任意数量的 bar,但用户每个 bar 只能有一个 foo。
如何在模型中执行此操作?
因为我在控制器中进行了检查,但显然这不是一个好主意,因为这是一个模型约束,应该在模型上而不是在控制器中。
解释我在问什么的最好方法是:
用户可以拥有任意数量的 foo,可以存在任意数量的 bar,但用户每个 bar 只能有一个 foo。
如何在模型中执行此操作?
因为我在控制器中进行了检查,但显然这不是一个好主意,因为这是一个模型约束,应该在模型上而不是在控制器中。
像这样:
class User < ActiveRecord::Base
has_many :bar
...
end
class Bar < ActiveRecord::Base
belongs_to :user
has_one :foo
...
end
在 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 错误
但这几乎强制执行“彼此”约束。