【问题标题】:Rails 3 ActiveRecord inserting autoincrement field issueRails 3 ActiveRecord插入自动增量字段问题
【发布时间】:2012-05-08 16:02:39
【问题描述】:

我正在使用:
Rails 3.0.9
Activerecord-sqlserver-适配器 3.0.15
TinyTds
MSSQL 2005

我有下表:

CREATE TABLE [dbo].[eclaims](
    [id_app] [int] IDENTITY(1,1) NOT NULL,
    [id_user] [int] NOT NULL,
    [property] [varchar](4) NOT NULL,
    [app_number] [varchar](15) NULL,
    [patent_number] [varchar](15) NULL,
    [native_number] [varchar](20) NULL,
    [title] [nvarchar](max) NULL,
    [applicants] [nvarchar](max) NULL,
    [receive_date] [datetime] NULL,
        [change_date] [datetime] NOT NULL CONSTRAINT [DF_eclaims_change_date]  DEFAULT (getdate()),
     CONSTRAINT [PK_eclaims] PRIMARY KEY CLUSTERED 
    (
        [id_app] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
    SET ANSI_PADDING OFF
    GO
    ALTER TABLE [dbo].[eclaims]  WITH CHECK ADD  CONSTRAINT [FK_eclaims_users] FOREIGN KEY([id_user])
    REFERENCES [dbo].[users] ([id])
    GO
    ALTER TABLE [dbo].[eclaims] CHECK CONSTRAINT [FK_eclaims_users]

型号为:

# coding: utf-8
class Eclaim < ActiveRecord::Base
end

如您所见,有一个名为 id_app 的自动增量字段。
当我尝试在 MSSQL 控制台中执行查询 insert into eclaims (id_user, [property], title) values (1, 2, 'Alex') 时,一切都很完美。

但是当我尝试Eclaim.create(:id_user =&gt; 1, :property =&gt; 'inv', :change_date =&gt; Time.now )

我收到这样的错误TinyTds::Error: DEFAULT or NULL are not allowed as explicit identity values.: INSERT INTO [eclaims] ([id_app], [id_user], [property], [app_number], [patent_number], [native_number], [title], [applicants], [receive_date], [change_date]) VALUES (NULL, 1, N'inv', NULL, NULL, NULL, NULL, NULL, NULL, '2012-05-08 06:39:14.882')

为什么 ActiverRecord 不自动插入自增字段id_app

提前致谢。

【问题讨论】:

  • 你能贴出你的型号代码吗?您是否覆盖受保护的批量分配属性?
  • 我已经编辑了我的问题,所以有一个模型代码。不,我没有。

标签: ruby-on-rails ruby-on-rails-3 activerecord tiny-tds


【解决方案1】:

Rails 是所有约定,它假定 'id' 列是主键。但是,由于您选择将 'id_app' 设置为表的主键,因此您也应该将其告知 Rails。

使用set_primary_key(value = nil, &block) 将“id_app”设置为主键,它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2012-05-29
    • 2010-09-09
    相关资源
    最近更新 更多