如何在Rails 3.2中验证其父模型范围内嵌套模型的唯一性?

时间:2012-07-04 08:01:40

标签: ruby-on-rails-3 validation activerecord

这是我的问题的一个例子。

我有一个'房间'模型:

class Room < ActiveRecord::Base
   has_many :items, :inverse_of => :room
   accepts_nested_attributes_for :items
end

我有一个'项目'模型:

class Item < ActiveRecord::Base
   belongs_to :room, :inverse_of => :items
   validates :some_attr, :uniqueness => { :scope => :room}
end

我想验证属于某个房间的所有项目的some_attr属性的唯一性。

当我尝试验证项目时,我收到此错误:

TypeError (Cannot visit Room)

我无法将验证范围设置为:room_id,因为项目尚未保存,因此id为nil。我还想阻止在“房间”模型中使用自定义验证器。

在Rails中有没有干净的方法?我也想知道我是否正确设置了:inverse_of选项......

1 个答案:

答案 0 :(得分:2)

我认为您使用inverse_of的方式没有任何问题。

至于问题,在类似的情况下,我最终强制迁移中的唯一性约束,如此

add_index :items, [ :room_id, :some_attr ], :unique => true

这是AR级别验证的补充

validates_uniqueness_of :some_attr, :scope => :room_id

(我不确定将关联名称用作作用域是否有效,在尝试引用查询中不存在的room列时,数据库适配器是否会引发异常?)