ActiveRecord主键是varchar,保存时出错

时间:2009-08-05 14:13:52

标签: sql-server ruby activerecord

我有一个活跃的记录类

  class Service_Catalogue < ActiveRecord::Base
    set_table_name  "service_catalogue"
    set_primary_key "myKey"
  end

myKey是一个nvarchar(sql server)。

当我尝试保存时

  service_catalogue= Service_Catalogue.new()
  service_catalogue.myKey = "somevalue"
  service_catalogue.save

我收到以下错误:

  IDENTITY_INSERT could not be turned OFF for table [service_catalogue] (ActiveRecord::ActiveRecordError)

似乎ActiveRecord认为主键是标识列(它不是varchar),因此失败。

有没有办法告诉它不要试图关闭身份插入?

更新

事实证明,活动记录sql server适配器的版本应该受到指责。 我之前一直在使用1.0.0.9250,但不知何故安装了2.2.19(我假设在进行gem更新时)。恢复到旧版本后,它可以正常工作。

2 个答案:

答案 0 :(得分:4)

如果不是这种情况,ActiveRecord喜欢使用整数ID列并抛出拟合。可以指导它来处理替代方案,但这取决于您的环境。

另一种方法是使用传统的基于整数的ID字段,以及用于查找的唯一“密钥”字段。

class Service_Catalogue < ActiveRecord::Base
  set_table_name  "service_catalogue"

  validates_uniqueness_of :myKey
end

如果可能,更改架构以适应ActiveRecord可能比指导ActiveRecord处理架构更方便。如果没有,你可能需要真正陷入困境。

另一种方法可能是使用像DataMapper这样的替代ORM,它没有相同的限制。

答案 1 :(得分:0)

我遇到的特殊问题是由于无意中的宝石升级造成的(幸好使用捆绑包现在这种情况不会发生!)。

旧的活动记录sql server adapter(1.0.0.9250)支持我想要完成的任务。