【发布时间】:2012-03-14 16:01:55
【问题描述】:
我对 Rails 中的范围唯一性验证有疑问。如果我尝试直接在子模型中创建一个具有我不想重复的相同属性集的新对象,那么它工作正常,但是当我尝试创建一个具有两个不唯一的孩子的父对象时,验证未触发。
背景
我在 Rails 3.2 中有一个应用程序,它的视图在 HAML 中,带有 simple_form。
我有两个模型:Page 和 Property。一个页面可以有很多属性,并且它接受属性的嵌套属性。
我想验证一个页面不能有两个同名的属性:
#app/models/page.rb
class Page < ActiveRecord::Base
has_many :properties
accepts_nested_attributes_for :properties, :allow_destroy => :true
end
#app/models/property.rb
class Property < ActiveRecord::Base
belongs_to :page
VALID_PROPERTIES = %w(id text name xpath class css)
validates :name, :inclusion => VALID_PROPERTIES, :uniqueness => {:scope => :page_id}
end
当然,该属性有 page_id 属性。
就像我说的,当通过它的表单创建一个新属性时,验证是有效的。如果我尝试创建一个具有相同名称和相同 page_id 的新属性,Rails 会告诉我该名称已被使用。
问题
如果我创建一个新页面,并通过嵌套表单分配各种属性,我可以绕过此验证。当 page_id 和 property_id 的组合还没有出现在数据库中时,这似乎只是一个问题,例如,如果我编辑一个 Page 模型,它已经保存了一个属性,我尝试添加一个新的同名,现在触发验证。
【问题讨论】:
标签: ruby ruby-on-rails-3 validation