Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server RubyonRails和MSSQL服务器:尝试插入具有newid()默认值的行_Sql Server_Ruby On Rails_Uniqueidentifier - Fatal编程技术网

Sql server RubyonRails和MSSQL服务器:尝试插入具有newid()默认值的行

Sql server RubyonRails和MSSQL服务器:尝试插入具有newid()默认值的行,sql-server,ruby-on-rails,uniqueidentifier,Sql Server,Ruby On Rails,Uniqueidentifier,(这个问题最初是几个月前在另一个论坛上发布的,没有得到任何答案……现在没有答案!) 我在RoR的第一步。我买了一本关于Ruby和RubyonRails的书。示例在MySQL上正确运行,因此我决定将其重写为MS-SQL,作为一个好的练习(并且MS-SQL是我们的标准数据库)。。这变成了一个噩梦: 我有一张有两个字段的表 Tbl_People ---------- id_People primary key, newid() default value, namePeople

(这个问题最初是几个月前在另一个论坛上发布的,没有得到任何答案……现在没有答案!)

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

我有一张有两个字段的表

Tbl_People
----------
id_People        primary key, newid() default value,
namePeople       string
我有一个到数据库的ODBC连接。我可以列出记录,但是。。。我无法在表格中插入任何内容。Ruby生成的插入字符串如下所示:

INSERT INTO Tbl_People (id_People, namePeople) VALUES('newid','GRONDIER, Philippe')
将被拒绝,因为字符串“newid”无法插入唯一标识符/主键字段
id\u People
。从逻辑上讲,返回的错误是:

DBI::DatabaseError: 37000 (8169) [Microsoft] [ODBC SQL Server Driver][SQL Server]Conversion failed when converting from a character string to uniqueidentifier
这似乎是一个非常明显的大问题和基本问题,以至于我觉得我错过了每个RoR培训文档上通常用粗体书写的内容,例如“不要尝试通过RoR插入”、“uniqueIdentifier是RoR的中文”或“RoR不适用于MS SQL Server”


有什么想法吗?

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

因此,您的id是“uniqueidentifier”类型。应该发生以下两件事之一:

a) 您应该传入NEWID()作为第一个参数。不是字符串“newid”,而是函数newid()

b) 不要通过第一个参数。因为有一个默认值,所以只需插入NamePeople列


根据使用情况,在处理分布式数据时,我只会使用uniqueidentifier主键,对于大多数键引用,我会坚持使用良好的旧INT-IDENTITY列。

查看这篇文章,不同的db类型,但本质上是相同的问题,如何对RoR隐藏默认字段,从而不会生成无效插入

EDIT@wayne conrad指出旧链接已经失效。我相信内容就是在这里找到的,

关键摘录如下

该页面的评论部分还引用了一个旨在解决该问题的项目 (链接现在不要让我失望!)


谢谢在这个博客中暴露的问题是完全不同的,但仍然是普遍感兴趣的。读完本文后,我可能想构建一个函数,在客户端生成uniqueId值。遗憾的是,链接现在已失效。插入字符串是由RUBY自动生成的,而不是由我生成的。RUBY生成字符串的方式显然是不正确的。
 # 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