4

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

我有一个“房间”模型:

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 选项......

4

1 回答 1

2

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

至于问题,在类似的情况下,我最终在迁移中强制使用唯一性约束,就像这样

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

这是对 AR 级验证的补充

validates_uniqueness_of :some_attr, :scope => :room_id

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

于 2012-07-04T19:19:38.210 回答