试图在rails上验证ruby的两层唯一性

时间:2012-10-24 19:47:21

标签: ruby-on-rails ruby validation assert

我正在寻找一个可以验证复合验证唯一性的测试(如果这样做有意义的话)。验证本身如下:

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

我该怎么做?我是否只是尝试创建两个具有相同名称的地方并尝试验证?例如(并且此代码不起作用)

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

1 个答案:

答案 0 :(得分:2)

place2可能有效,因为您没有将place保存到数据库中。我会试试这个:

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

另外,我建议你阅读一些关于数据库规范化的内容。您应该为cuisinestatecountry设置单独的表格,而不是将这些值存储为自由格式文本。