Ruby on rails Rails 3 ActiveRecord插入无法插入值Null

Ruby on rails Rails 3 ActiveRecord插入无法插入值Null,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我正在使用: Rails 3.0.9 MSSQL 2005 我有一张桌子: CREATE TABLE [dbo].[edocs]( [id] [int] IDENTITY(1,1) NOT NULL, [id_claim] [int] NOT NULL, [id_material] [smallint] NOT NULL, [is_secondary] [bit] NOT NULL CONSTRAINT [DF_edocs_is_secondary] DEFAU

我正在使用:
Rails 3.0.9
MSSQL 2005

我有一张桌子:

CREATE TABLE [dbo].[edocs](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [id_claim] [int] NOT NULL,
    [id_material] [smallint] NOT NULL,
    [is_secondary] [bit] NOT NULL CONSTRAINT [DF_edocs_is_secondary]  DEFAULT ((0)),
    [title] [varchar](100) COLLATE Ukrainian_CI_AS NOT NULL,
    [ext] [varchar](4) COLLATE Ukrainian_CI_AS NOT NULL,
    [size] [int] NOT NULL,
    [code] [varchar](10) COLLATE Ukrainian_CI_AS NULL,
    [receive_date] [datetime] NOT NULL CONSTRAINT [DF_edocs_receive_date]  DEFAULT (getdate()),
    [reg_date] [datetime] NULL,
    [reg_numb] [varchar](10) COLLATE Ukrainian_CI_AS NULL,
    [idcead] [int] NULL,
    [efile] [int] NULL
)

某些字段具有默认值(例如,接收日期) 在Rails controller中,我尝试创建新记录:

    Edoc.create(
        :id_claim => @claim_index, 
        :id_material => @doc_code, 
        :title => @file_list.first[:name],
        :ext => @file_list.first[:ext],
        :size => @file_list.first[:size],
        :code => @materials[@doc_code]["code"]
    )
但我收到了错误信息:

ActiveRecord::StatementInvalid (TinyTds::Error: Cannot insert the value NULL int
o column 'receive_date', table 'eFilling.dbo.edocs'; column does not allow nulls
. INSERT fails.: INSERT INTO [edocs] ([id_claim], [id_material], [is_secondary],
 [title], [ext], [size], [code], [receive_date], [reg_date], [reg_numb], [idCEAD
], [eFile]) VALUES (100000, 3, 0, N'text', N'rtf', 80
472, N'al', NULL, NULL, NULL, NULL, NULL)):
但在MSSQL 2005控制台中,我可以做到:

insert into edocs ([id_claim], [id_material],[title], [ext], [size]) values(1, 1, 'rrr', 'rtf', 123)
我不希望ActiveRecord自动通过在我的create方法中添加未指向的字段来完成查询


我该怎么做

我相信,即使您编写了要插入的直接SQL查询,并且没有为“notnull”字段指定值,并且它们没有默认值,您仍然会抛出SQL错误。我建议要么允许这些字段为NULL,要么给它们一个默认值(可能是“”或0?)

这不仅仅是Rails的事情,这要归结到SQL查询本身

例如,对于具有“id”、“email”和“name”的表,其中“name”不为null且没有默认值,这将失败:

插入表(id、电子邮件)值('3','test@example.com)

当SQL将空值作为'name'的值传递时


把它想象成一个“必填字段”,当它没有默认值而不是null时

我相信即使您编写了直接的SQL查询来插入,并且没有为“notnull”字段指定值,并且它们没有默认值,您仍然会抛出SQL错误。我建议要么允许这些字段为NULL,要么给它们一个默认值(可能是“”或0?)

这不仅仅是Rails的事情,这要归结到SQL查询本身

例如,对于具有“id”、“email”和“name”的表,其中“name”不为null且没有默认值,这将失败:

插入表(id、电子邮件)值('3','test@example.com)

当SQL将空值作为'name'的值传递时


当它不为空且没有默认值时,可以将其视为“必填字段”

谢谢您的建议。但MSSQL 2005允许我在edocs([id_索赔]、[id_材料]、[title]、[ext]、[size])中插入值(1,1,'rrr','rtf',123),正如您所看到的,MSSQL允许我在查询中不使用默认值指定字段。MSSQL会自动插入默认值(getdate()),那么为什么不将当前时间戳设置为默认值呢?我该怎么做?create(:receive_date=>Time.now)?在模型中设置默认值。看看这个链接:谢谢你的建议。但MSSQL 2005允许我在edocs([id_索赔]、[id_材料]、[title]、[ext]、[size])中插入值(1,1,'rrr','rtf',123),正如您所看到的,MSSQL允许我在查询中不使用默认值指定字段。MSSQL会自动插入默认值(getdate()),那么为什么不将当前时间戳设置为默认值呢?我该怎么做?create(:receive_date=>Time.now)?在模型中设置默认值。请看此链接: