Попытка проверки двухуровневой уникальности для 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. Используйте валидации :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 и обязательно перенесу кухню, штат и страну в другую таблицу и свяжу их с этой записью. - person MrBernz; 25.10.2012