0

複合検証の一意性を検証できるテストを作成しようとしています (それが理にかなっている場合)。検証自体は次のとおりです。

validates_uniqueness_of :name, :scope => [:address_postcode]

それ、どうやったら出来るの?同じ名前の場所を 2 つ作成して検証するだけでよいでしょうか? たとえば(このコードは機能しません)

test "name and postcode of a new place must be unique" do
  place = Place.new(description: "my favourite chinese", cuisine:"chinese", 
    address_state:"NSW", address_country:"Australia", address_postcode:"2209")
  place.name = "Masthai"
  assert place.valid?

  place2 = Place.new(description: "try a second restaurant", cuisine:"chinese", 
    address_state:"NSW", address_country:"Australia", address_postcode:"2209")
  place2.name = "Masthai"
  assert place2.invalid?
end
4

1 に答える 1

2

place2placeデータベースに保存していないため、おそらく有効です。私はこれを試してみます:

test "name and postcode of a new place must be unique" do
  place = Place.create(description: "my favourite chinese", cuisine:"chinese", 
    address_state:"NSW", address_country:"Australia", address_postcode:"2209")
  place.name = "Masthai"
  assert place.valid?

  place2 = Place.new(description: "try a second restaurant", cuisine:"chinese", 
    address_state:"NSW", address_country:"Australia", address_postcode:"2209")
  place2.name = "Masthai"
  assert place2.invalid?
end

また、フォーマット/スタイルに関する提案を提供したいと思います。

test "name and postcode of a new place must be unique" do
  place = Place.create(
    description: "my favourite chinese",
    cuisine: "chinese", 
    address_state: "NSW",
    address_country: "Australia",
    address_postcode: "2209",
    name: "Masthai"
  )
  assert place.valid?

  place2 = Place.new(
    description: "try a second restaurant",
    cuisine: "chinese", 
    address_state: "NSW",
    address_country: "Australia",
    address_postcode: "2209",
    name: "Masthai"
  )
  assert place2.invalid?
end

また、データベースの正規化について少し読むことをお勧めします。これらの値を自由形式のテキストとして格納するのではなく、実際にはcuisine、、stateおよびの個別のテーブルを用意する必要があります。country

于 2012-10-24T19:51:43.850 に答える