私は、州と国の2つのモデルを作成しました。 country
belongs_to
協会(country_id
列)ビーイング私の一意性検証が実行されていません。私は何が欠けていますか?
+-------+ +---------+
| State +----<>+ Country +
+-------+N .. 1+---------+
:彼らはいくつかのフィールドと1本のFKの関係を有しています。
国と州の両方に内部コードがあり、州には(code, country)
の一意性制約があります。
私はコンソールでこれらのコマンドを実行すると:予想通り
us = Country.find_by_iso_abbr :US
ak = State.find_by iso_abbr: :AK, country: us
State.create(iso_abbr: :ak, country: us, name: 'Foo')
これらの行は、実際に働いています。両方のテーブルのiso_abbr
は、私が話した実際のコードフィールドを表しています。
実行すると、このコードは予想通りに爆発します(ActiveRecord::RecordNotUnique
)。
しかし、モデルバリデーターを含めてデータベースレベルの爆発にはモデルで到達できないようにしたいと考えました。私が試したことはある:
モデル/ country.rb
それがこの問題
class Country < ...
...
validates_uniqueness_of :iso_abbr
...
end
モデル/ state.rb
には関係ありませんので、省略コードは省略記号に置き換え 省略されたコードは、この問題には関係しないため、省略記号に置き換えられます。
class State < ...
...
validates_uniqueness_of :iso_abbr, scope: :country
...
end
そして再び3行を実行しているときに爆発は私は何の検証がされていないと思いますから、私は、(検証が失敗しなければならないので).create
文ではなくActiveRecord::RecordNotUnique
と爆発の無効、保存されていないオブジェクトを返すことを期待実行されます(または、検証がパスしている可能性があります)。
My Railsのバージョンは4.2.0です。
:確認済!検証はがになります。私の視点からは失敗するはずです。コンソールでこれを実行すると:State.new(iso_abbr: :ak, country: us, name: 'Foo').valid?
私はtrue
を取得しますが、私はfalse
を期待しています。
編集2:大藤私が書く場合に予想されるようCountry.create(iso_abbr: :US, name: 'Foo')
検証が実行される(iso_abbr
がCountry
モデルで、それ自体でユニークである)と、(とないの例外を除いて)期待通りに失敗しました。
私はここで何が欠けていますか?
これは質問に対する答えではありません。私の質問は例外に関するものではなく、失敗の代わりに検証*渡し*に関するものでした。 –
しかし、検証は合格していません... RecordNotUniqueのために失敗しています - 上のリンク/引用はRails APIの 'validates_uniqueness_of'からです –
いいえ試してみてください。' State.new(iso_abbr: ' ak '、国:us、名前:' Cucaracha ')valid?'検証は成功します(つまり、trueを返します)。 –