【发布时间】:2011-07-20 18:10:00
【问题描述】:
我有两个模型
class Group < AR
has_many :permissions
accepts_nested_attributes_for :permissions, :allow_destroy => true
end
class Permission < AR
validates_uniqueness_of :action, :scope => [:role]
end
我似乎无法在创建新组时获得对工作权限的唯一限制,仅在更新时。这是一个示例输出。有谁知道对嵌套属性和唯一约束进行验证的最佳方法?
样本输出
> g = Group.create(:permissions_attributes => [{:role => 'admin', :action => 'one'}])
> # Now add the same permissions, should not be valid
> g.permissions_attributes = [{:role => 'admin', :action => 'one'}]
> g.valid? # => false
这是意料之中的。但是,如果我两次使用相同的 permissions_attributes 创建组,它不会失效:
> g = Group.new(:permissions_attributes => [{:role => 'admin', :action => 'one'}, {:role => 'admin', :action => 'one'}]
> g.valid? # => true BUT THIS SHOULD BE FALSE!!
> g.save # => true Oh Nos!!!
【问题讨论】:
-
这很可能是因为每个权限都保存在同一个事务中(父事务)。来自 rails 文档:“对模型的所有更改,包括对标记为销毁的那些的销毁,都会在保存父模型时自动和原子地保存和销毁。这发生在由父保存方法发起的事务中。”我的猜测是唯一性的数据库查找正在传递,因为对象还没有真正存储。
-
这个问题你解决了吗?我有同样的事情stackoverflow.com/questions/8111424/…
-
抱歉,这个问题早就忘记了,因为我继续做其他事情,所以还没有研究最终的解决方案。
标签: ruby-on-rails validation nested-attributes