加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 验证嵌套表单中子对象的唯一性无法正常工作

发布时间:2020-12-17 02:17:30 所属栏目:百科 来源:网络整理
导读:我在Rails中的作用域唯一性验证有问题.如果我尝试使用我不想重复的相同属性集创建一个具有直接在子模型中的新对象,但是当我尝试创建具有两个不唯一的子节点的父对象时,它可以正常工作没有触发. 背景 我在Rails 3.2中有一个应用程序,它在HAML中的视图使用simp
我在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模型,并且我尝试添加一个新的一个相同的名称,验证现在触发.

解决方法

我会试试 validates_associated

class Page < ActiveRecord::Base
  has_many :properties
  accepts_nested_attributes_for :properties,:allow_destroy => :true
  validates_associated :properties 
end

更新

有关验证状态的Rails指南:

The validation happens by performing an SQL query into the model’s
table,searching for an existing record with the same value in that
attribute.

您正在创建的2 Properties对象在数据库中尚不存在,因此唯一性验证无法工作.您应该尝试使用自定义验证

class Property < ActiveRecord::Base
  #...
  validate :name,:name_uniqueness

  def name_uniqueness 
    self.page.properties.select {|p| p.key == self.key}.size == 1
  end
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读