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(アソシエーション名をスコープとして使用することが有効かどうかはわかりませんが、クエリで存在しない列を参照しようとすると、DB アダプターは例外を発生させませんか?)

于 2012-07-04T19:19:38.210 に答える