私もそのような行動に苦しんでいます...
コード:
@thing.tag_ids = params[:thing][:tag_ids]
DB アドホックで変更を行い、検証を呼び出さないため、次のようになります。
@thing.update_attributes(params[:thing][:tag_ids])
とは異なります
@thing.tag_ids = params[:thing][:tag_ids]
@thing.save
要するに:
@thing.tag_ids = params[:thing][:tag_ids] # makes changes in DB w/o validations
@thing.save # runs validations before making changes to DB
また、使用時に検証を実行する可能性があるかどうかも尋ねています。
@instance.collection_singular_ids = other_singular_ids
簡単な修正として、オーバーライド メソッドを親モデル (「もの」) に次のように追加しました。
def tag_ids=(ids)
super
rescue ActiveRecord::RecordInvalid => e
self.errors.add(:base, e.message)
end
次のように、結合モデルでタグの重複を防ぐための検証ツール:
validates :tag_id, :uniqueness => {:scope => :thing_id}
誰かがより良い修正をしていますか?