我有以下内容:
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}},那时为验证做回调为时已晚。
答案 0 :(得分:1)
在B中,你可以拥有
validates :c_id, :uniqueness => { :scope => :a_id }