如何显式插入主键值?

时间:2010-06-23 07:09:32

标签: ruby-on-rails activerecord

我有一个名为 messages 的表,这里是表结构,我不希望 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';

如果我将此哈希保存到消息表中,则id不会插入

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

Rails正在使用 id 构建插入sql,因此 id 值不会插入消息表。

如何在表中插入id值,这个插入sql rails使用 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');

2 个答案:

答案 0 :(得分:4)

在从旧数据迁移时设置ID值通常很有用,或者 - 正如我现在所做的那样 - 在保留FK完整性的同时合并两个应用程序。

我只是抓了一会儿,似乎你必须在强调保存之前设置PK值。保存记录后,ActiveRecord将忽略#id =或update_attribute。因此,在使用属性哈希设置记录时,我使用:

article = Article.new(attrs)
article.id = attrs["id"]
article.save!

答案 1 :(得分:-1)

你正在反对rails工作的方式。 ActiveRecord保留使用 id 列并为您管理。

  • 如果 id 是主键,为什么 id 不是自动递增列?
  • 为什么你需要控制它的价值?

如果您需要id列,您可以控制自己,添加另一个。它不是主键,但你也可以把它作为一个独特的索引。