2010-06-23 7 views
3

У меня есть таблица сообщений и вот структура таблицы, я не хочу id - это поле с автоматическим приращением, но оно должно быть первичным ключом для этой таблицы.Как вставить значение первичного ключа явно?

Вот структура таблицы для сообщений

CREATE TABLE `messages` (
     `id` INT(11) NOT NULL, 
     `user_id` INT(11) NOT NULL, 
     `text` VARCHAR(255) NOT NULL, 
     `source` VARCHAR(100), 
     `created_at` DATETIME DEFAULT NULL, 
     `updated_at` DATETIME DEFAULT NULL, 
     PRIMARY KEY (`id`) 
    ); 

в то время как вставить данные в таблицу я использую ниже хэш-объекта

msg['id'] = 12345; 
msg['user_id'] = 1; 
msg['text'] = 'Hello world'; 

Если я сохранить этот хэш в таблицу сообщений, идентификатор не вставка

message = Message.new(msg); 
message.save! 

Rails is build in insert sql без id, поэтому id Значение не вставляет таблицу сообщений.

Как вставить значение идентификатора в таблице, это вставные SQL рельсы построить с, используя ID поле

INSERT INTO `users` (`updated_at`, `user_id `, `text`, `created_at`) VALUES('2010-06-18 12:01:05', '1', 'Hello world', '2010-06-18 12:01:05'); 

ответ

-1

Вы работаете на пути рельсы работы. ActiveRecord резервирует использование колонки id и управляет ею для вас.

  • Почему идентификатор не должен быть Автоинкрементный столбец, если это первичный ключ?
  • Зачем вам нужно контролировать его стоимость?

Если вам нужен столбец идентификатора, вы можете контролировать себя, добавить еще один. Это не будет основной ключ, но вы можете сделать его уникальным индексом.

+1

Это завет против Rails, если я когда-либо слышал его. – jeffcook2150

+4

@cookiecaper Ваш комментарий звучит как предрассудок или тролль. Непродуктивно. [Суррогатный ключ] (http://en.wikipedia.org/wiki/Surrogate_key) - это давно принятая практика базы данных, в которой построена Rails. Я должен добавить, что есть [способы обойти это] (http://stackoverflow.com/questions/1585323/how-to-turn-off-auto-increment-in-rails-active-record). Это не невозможно, но вы можете просто стрелять в ногу без уважительной причины. –

+0

Вы можете установить его, если вы делаете '' 'message.id = some_value''', перед вызовом' '' message.save''' – sethcall

3

Значение параметра ID часто полезно при переносе из устаревших данных или - как я делаю прямо сейчас - слияние двух приложений при сохранении целостности FK.

Я просто почесал голову на некоторое время и, кажется, вы должны установить значение PK перед тем вызова СОХРАНИТЬ. После сохранения записи ActiveRecord игнорирует # id = или update_attribute. Поэтому при настройке записи из хеша атрибута я использую:

article = Article.new(attrs) 
article.id = attrs["id"] 
article.save! 
Смежные вопросы