Ruby on Rails и MSSQL Server: попытка вставить строки со значениями по умолчанию newid () - PullRequest
2 голосов
/ 23 января 2009

(этот вопрос был первоначально опубликован на другом форуме несколько месяцев назад, без какого-либо ответа ... в это время не было ТАК!)

Мои первые шаги в RoR. Я купил одну из этих книг, рассказывающую о Ruby и Ruby On Rails. Примеры правильно работают на MySQL, поэтому я решил переписать их для MS-SQL как хорошее упражнение (а MS-SQL - наша стандартная база данных) ... и это превратилось в дурной сон:

У меня есть эта таблица с 2 полями

Tbl_People
----------
id_People        primary key, newid() default value,
namePeople       string

У меня есть соединение ODBC с базой данных. Я могу перечислить записи, но ... я не могу делать какие-либо вставки в таблицу. Строка INSERT, сгенерированная Ruby, выглядит следующим образом:

INSERT INTO Tbl_People (id_People, namePeople) VALUES('newid','GRONDIER, Philippe')

И будет отклонено, поскольку строку 'newid' нельзя вставить в поле uniqueindentifier / primary key id_People. Логически возвращаемая ошибка:

DBI::DatabaseError: 37000 (8169) [Microsoft] [ODBC SQL Server Driver][SQL Server]Conversion failed when converting from a character string to uniqueidentifier

Кажется, это настолько очевидная большая и основная проблема, что я чувствую, что пропустил что-то, обычно написанное жирным шрифтом в каждом учебном документе RoR, такое как «Не пытайтесь вставлять через RoR», «uniqueIdentifier - от китайского до RoR» «RoR не работает с MS SQL Server» ...

Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 января 2009

Посмотрите этот пост, другой тип БД, но, по сути, та же проблема, как скрыть поля по умолчанию от RoR, чтобы не сгенерировать неверную вставку.

РЕДАКТИРОВАТЬ @ Уэйн-Конрад указал, что старая ссылка была мертва. Я считаю, что содержание было то, что находится здесь, http://inodes.org/2008/01/11/rails-activerecord-mysql-guids-and-the-rename_column-bug/

Отрывок ключа ниже.

Раздел комментариев на странице также ссылается на проект, предназначенный для устранения проблемы. https://github.com/cch1/uuid_primary_key/tree/master (ссылки не подводят меня сейчас!)

 # HACK (JF) - This is too evil to even blog about
  # When we use guid as a primary key we usually rename the original 'id'
  # field to 'integer_id'. We need to hide this from rails so it doesn't
  # mess with it. WARNING: This means once you use usesguid anywhere you can
  # never access a column in any table anywhere called 'integer_id'

class ActiveRecord::Base
  private
    alias :original_attributes_with_quotes :attributes_with_quotes

    def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true)
      quoted = original_attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true)
      quoted.delete('integer_id')
      quoted
    end
end
1 голос
/ 23 января 2009

Я не Ruby парень, так что просто имейте это в виду. Большая часть этого просто потеряна в переводе IMO MySQL-> MSSQL.

Итак, ваш идентификатор имеет тип "uniqueidentifier". Должно произойти одно из двух:

a) вы должны передать NEWID () в качестве первого параметра. Не строка 'newid', а функция NEWID ()

б) не переходите в первый параграф. Поскольку существует значение по умолчанию, просто вставьте его в столбец NamePeople.

В зависимости от использования я бы использовал первичные ключи uniqueidentifier только в том случае, если вы имеете дело с распределенными данными, и для большинства ключевых ссылок придерживался старых добрых столбцов INT IDENTITY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...