在rails中,如何通过关联实现多个约束

时间:2014-04-24 05:23:07

标签: ruby-on-rails validation activerecord has-many-through

我有以下内容:

class A < Active... 
  has_many :bs
  has_many :cs, through: :bs
  accepts_nested_attributes_for :bs
  accepts_nested_attributes_for :cs
end
clas B < Active...
  belongs_to :a
  belongs_to :b
  accepts_nested_attributes_for :cs
end
class C < Active... 
  has_many :bs
  has_many :as, through: :bs
end

我想添加唯一性约束,以便A.cs的集合永远不会重复。也就是说没有两个As可以拥有与它们相关的完全相同的Cs集合。如果这个A存在:

A.first.cs.pluck(:key) => ['c1', 'c2']

然后在删除或更新第一个A之前,没有其他A可以分配['c1','c2']。

我可以想到两种方式,但是有一种方式:

1)对A表进行非规范化,添加一个'cs'列,其中包含与每个Cs对象关联的所有A的字符串,然后将约束放在新的'cs'上'专栏。

2)Instanciate所有现有As并将每个a与新As进行比较

最大的问题是,使用nested_attributes_for Bs同时创建Cs a = A.create(bs_attributes:[{cs_attributes:{...}},{cs_attributes:{...}}])a.cs将不会填充a创建{{1}},那时为验证做回调为时已晚。

1 个答案:

答案 0 :(得分:1)

在B中,你可以拥有

validates :c_id, :uniqueness => { :scope => :a_id }