Rails 3 ActiveRecord вставляет проблему автоинкрементного поля
Я использую:
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.
Когда я пытаюсь выполнить запрос insert into eclaims (id_user, [property], title) values (1, 2, 'Alex')
в консоли MSSQL все идет отлично.
Но когда я пытаюсь Eclaim.create(:id_user => 1, :property => 'inv', :change_date => 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 автоматически?
Заранее спасибо.
1 ответ
Rails - это все соглашения, и он предполагает, что столбец id является первичным ключом. Тем не менее, поскольку вы решили установить id_app в качестве основного ключа таблицы, вы должны сообщить об этом и Rails.
Используйте set_primary_key(value = nil, &block), чтобы установить 'id_app' в качестве первичного ключа, и он должен работать.