Ruby on rails 如何显式插入主键值?

Ruby on rails 如何显式插入主键值?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个名为messages的表,这是表结构,我不希望id是自动递增字段,但它应该是该表的主键 下面是消息的表结构 在将数据插入表时,我使用下面的哈希对象 msg['id'] = 12345; msg['user_id'] = 1; msg['text'] = 'Hello world'; 若我将此哈希保存到messages表中,则id不会插入 message = Message.new(msg); message.save! Rails正在构建id为out的insert sql,所以id

我有一个名为messages的表,这是表结构,我不希望id是自动递增字段,但它应该是该表的主键

下面是消息的表结构

在将数据插入表时,我使用下面的哈希对象

msg['id'] = 12345; 
msg['user_id'] = 1;
msg['text'] = 'Hello world';
若我将此哈希保存到messages表中,则id不会插入

message = Message.new(msg);
message.save!
Rails正在构建id为out的insert sql,所以id值不是插入消息表

如何在表中插入id值,这是insert sql rails构建时不使用out using id字段


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

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

如果您需要一个id列,您可以控制自己,添加另一个。它不会是主键,但您也可以将其设置为唯一索引。

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

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

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

这是一份反对Rails的遗嘱,如果我听过的话。@cookiecaper你的评论听起来像是偏见,或者说是恶棍。没有生产力。是Rails构建的一种长期被接受的数据库实践。我应该补充一点,有。这不是不可能的,但你可能只是无缘无故地朝自己的脚开枪。如果你在调用
消息之前执行
message.id=some_value
,你可以设置它。保存
我没有否决投票,但我认为这不是一个完整的答案。我同意这不是“Rails方式”,但遗留数据库并不关心Rails。
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');
article = Article.new(attrs)
article.id = attrs["id"]
article.save!