【问题标题】:rails accepts_nested_attributes_for and validations... Rails 2.3.11rails accept_nested_attributes_for 和验证... Rails 2.3.11
【发布时间】: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


【解决方案1】:
class Group < AR
  has_many :permissions
  accepts_nested_attributes_for :permissions, :allow_destroy => true
  validates_associated :permissions
end

【讨论】:

  • 试过了,什么也没做,你在建议之前测试过吗?
  • @npiv,不是每个答案都是答案 :) 这是一次尝试。
  • 可以确认到今天这仍然不起作用,accept_nested_attributes_for 已经在内部调用了 validates_associated
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 2012-08-05
相关资源
最近更新 更多