2016-05-17 14 views
0

私は、州と国の2つのモデルを作成しました。 countrybelongs_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_abbrCountryモデルで、それ自体でユニークである)と、(とないの例外を除いて)期待通りに失敗しました。

私はここで何が欠けていますか?

答えて

1

OPで使用される2つのシンボルの違いの結果である必要があります。:ak:AKは、PostgresなどのDBでは大文字と小文字を区別して比較するために同じに見えません。

+0

これは質問に対する答えではありません。私の質問は例外に関するものではなく、失敗の代わりに検証*渡し*に関するものでした。 –

+0

しかし、検証は合格していません... RecordNotUniqueのために失敗しています - 上のリンク/引用はRails APIの 'validates_uniqueness_of'からです –

+0

いいえ試してみてください。' State.new(iso_abbr: ' ak '、国:us、名前:' Cucaracha ')valid?'検証は成功します(つまり、trueを返します)。 –

関連する問題