ActiveRecordでkakurenbo-putiを使っている時のuniqueness検証
2327 ワード
- Padrinoアプリを作っているうちに、モデルのuniquenessの検証をする必要があった。モデルには論理削除を設けているので、論理削除されたものは除外してuniquenessの検証をする必要があった。
- かつてparanoiaを使っている時は、
validates_as_paranoid
としておくと適切に処理してくれたが、paranoiaはActiveRecordのバージョンアップに伴って動かなくなることがあって辛かった。 - ActiveRecordのメソッドを上書きしないkakurenbo-putiを使うようにしているが、uniqueness検証の書き方で錯誤したので、記す。
- 最初こう書いた。
models/a.rb
class A < ActiveRecord::Base
soft_deletable column: :deleted_at
validates :name,
uniqueness: {unless: :soft_destroyed?, message: "This name in Japanese is already existing."}
end
こうすると、A.new(name: "あ")
した時には当然soft_destroyed?
はnil
なのですり抜けてしまう。
- こう書くのが正しいと思う。
models/a.rb
class A < ActiveRecord::Base
soft_deletable column: :deleted_at
validates :name,
uniqueness: {conditions: ->{without_soft_destroyed}, message: "This name in Japanese is already existing."}
end
- uniqueness検証の場合、今から作成や格納しようとするレコードを見て足りるわけではなく、あるスコープ全体を見る必要があるということに気付いた。
Author And Source
この問題について(ActiveRecordでkakurenbo-putiを使っている時のuniqueness検証), 我々は、より多くの情報をここで見つけました https://qiita.com/aprikip/items/9d82dd16c57d77cee0e1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .