Опитвайки се да валидирам двустепенна уникалност за ruby ​​on rails

Търся да напиша тест, който може да потвърди уникалността на валидиране на съединение (ако това има смисъл). Самото валидиране е както следва:

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

person MrBernz    schedule 24.10.2012    source източник
comment
Ако използвате ror 3. Използвайте validates :uniqueness =› {:scope =› :address_postcode}   -  person Manjunath Manoharan    schedule 24.10.2012


Отговори (1)


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

Освен това бих ви препоръчал да прочетете малко за нормализирането на базата данни. Трябва наистина да имате отделни таблици за cuisine, state и country, вместо да съхранявате тези стойности като текст в свободна форма.

person Jason Swett    schedule 24.10.2012
comment
Благодаря, да, свърши работа. В момента просто плащам с RoR и определено ще преместя Cuisine, държава и държава на друга маса и ще ги свържа обратно към този запис. - person MrBernz; 25.10.2012