Первичный ключ ActiveRecord — это varchar, ошибка при сохранении

У меня есть активный класс записи

  class Service_Catalogue < ActiveRecord::Base
    set_table_name  "service_catalogue"
    set_primary_key "myKey"
  end

myKey — это nvarchar (сервер sql).

Когда я пытаюсь сохранить его

  service_catalogue= Service_Catalogue.new()
  service_catalogue.myKey = "somevalue"
  service_catalogue.save

Я получаю следующую ошибку:

  IDENTITY_INSERT could not be turned OFF for table [service_catalogue] (ActiveRecord::ActiveRecordError)

Похоже, что ActiveRecord считает, что первичный ключ является столбцом идентификаторов (это не varchar), и поэтому терпит неудачу.

Есть ли способ сказать, чтобы он не пытался отключить вставку личности?

ОБНОВЛЕНИЕ

Оказывается виновата была версия активного адаптера sql server. Раньше я использовал 1.0.0.9250, но каким-то образом был установлен 2.2.19 (я полагаю, при обновлении драгоценного камня). После возврата на старую версию все работает.


person Derek Ekins    schedule 05.08.2009    source источник
comment
да, хреновый дизайн, но так и должно быть :)   -  person Derek Ekins    schedule 07.08.2009


Ответы (2)


ActiveRecord предпочитает столбцы с целочисленными идентификаторами и выдает ошибку, если это не так. Его можно научить справляться с альтернативами, но это зависит от вашего окружения.

В качестве альтернативы можно использовать обычное целочисленное поле идентификатора и уникальное поле «ключ», которое используется для поиска.

class Service_Catalogue < ActiveRecord::Base
  set_table_name  "service_catalogue"

  validates_uniqueness_of :myKey
end

Если это возможно, может быть удобнее изменить вашу схему, чтобы она соответствовала ActiveRecord, чем обучать ActiveRecord работать с вашей схемой. Если нет, вам, возможно, придется действительно спуститься и испачкаться.

Другой подход может заключаться в использовании альтернативного ORM, такого как DataMapper, который не имеет таких же ограничений.

person tadman    schedule 05.08.2009
comment
спасибо за предложение. к сожалению, это система, которую я не могу изменить и должен использовать AR. Я все равно нашел решение и обновил ответ. - person Derek Ekins; 07.08.2009

Конкретная проблема, с которой я столкнулся, была вызвана непреднамеренным обновлением драгоценного камня (к счастью, с помощью упаковщика сейчас этого не происходит!).

Старый адаптер сервера sql с активной записью (1.0.0.9250) поддерживает то, что я пытался выполнить.

person Derek Ekins    schedule 16.02.2011