2009-01-23 81 views
2

(这个问题最初是在几个月前发布在另一个论坛上,没有得到任何答案......在这些时候没有SO!)Ruby on Rails和MSSQL Server:尝试插入newid()默认值的行

我在RoR的第一步。我借鉴了其中一本关于Ruby和Ruby On Rails的书。示例在MySQL上正确运行,因此我决定将它们重写为MS-SQL作为一个良好的练习(并且MS-SQL是我们的标准数据库)..并且它变成了一个噩梦:

我有这张表与2个字段

Tbl_People 
---------- 
id_People  primary key, newid() default value, 
namePeople  string 

我有一个ODBC连接到数据库。我可以列出记录,但是......我无法在表格中插入任何内容。由红宝石产生的INSERT串如下:

INSERT INTO Tbl_People (id_People, namePeople) VALUES('newid','GRONDIER, Philippe') 

并且将被拒绝,因为字符串“newid的”不能在uniqueindentifier /主键字段id_People插入。从逻辑上讲,返回的错误是:

DBI::DatabaseError: 37000 (8169) [Microsoft] [ODBC SQL Server Driver][SQL Server]Conversion failed when converting from a character string to uniqueidentifier 

这似乎是如此显然是一个重要和基本的问题,我觉得我错过了一些东西通常用粗体每个RoR的培训文件,如“不要试图通过回报率的INSERT ','uniqueIdentifier是RoR的中文',或'RoR不能与MS SQL Server一起使用'...

任何想法?

回答

1

我不是一个红宝石男人,所以请记住这一点。其中大部分只是在MySQL-> MSSQL翻译IMO中丢失了。

因此,您的ID是“uniqueidentifier”类型。其中一件事情应该发生:

a)你应该传入NEWID()作为第一个参数。不是字符串'newid',但函数NEWID()

b)不传入第一个参数。由于有一个默认值,只需插入NamePeople列。

根据使用情况,如果处理分布式数据,我只会使用uniqueidentifier主键,而对于大多数关键引用,我会坚持使用旧的INT IDENTITY列。

+0

的INSERT字符串自动生成的红宝石,而不是我。 RUBY生成字符串的方式显然不正确。 – 2009-01-23 10:01:50

1

看看这篇文章,不同的数据库类型,但基本上相同的问题,如何隐藏来自RoR的默认字段,因此无法生成无效插入。

EDIT @ wayne-conrad指出旧链接已经死亡。我相信内容是在这里找到的, http://inodes.org/2008/01/11/rails-activerecord-mysql-guids-and-the-rename_column-bug/

下面的关键摘录。

页面的评论部分还引用旨在解决这个问题的一个项目 https://github.com/cch1/uuid_primary_key/tree/master(链接不要辜负我!)

# HACK (JF) - This is too evil to even blog about 
    # When we use guid as a primary key we usually rename the original 'id' 
    # field to 'integer_id'. We need to hide this from rails so it doesn't 
    # mess with it. WARNING: This means once you use usesguid anywhere you can 
    # never access a column in any table anywhere called 'integer_id' 

class ActiveRecord::Base 
    private 
    alias :original_attributes_with_quotes :attributes_with_quotes 

    def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true) 
     quoted = original_attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true) 
     quoted.delete('integer_id') 
     quoted 
    end 
end 
+0

谢谢。在这个博客中暴露的问题是完全不同的,但仍然是一般的兴趣。读完这个之后,我想建立一个函数来在客户端生成uniqueId值 – 2009-01-23 02:25:20