2

(この質問は、もともと数か月前に別のフォーラムに投稿されましたが、何の回答も得られませんでした...この時点ではSOはありませんでした!)

RoRでの私の最初のステップ。私はRubyとRubyOnRailsについて話しているこれらの本の1つを手に入れました。例はMySQLで正しく実行されているので、MS-SQL用に書き直すことにしました(MS-SQLは標準データベースであるため)。そして、それは悪い夢になりました。

私は2つのフィールドを持つこのテーブルを持っています

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

データベースへのODBC接続があります。レコードを一覧表示することはできますが、テーブルに挿入できません。Rubyによって生成される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は'MSSQLServerでは動作しません'..。

何か案が?

4

2 に答える 2

1

私はRubyの人ではないので、それを覚えておいてください。これのほとんどは、MySQL->MSSQL変換IMOで失われます。

したがって、IDは「uniqueidentifier」タイプです。次の2つのいずれかが発生する必要があります。

a)最初のパラメータとしてNEWID()を渡す必要があります。文字列'newid'ではなく、関数NEWID()

b)最初のパラメータを渡さないでください。デフォルト値があるので、NamePeople列に挿入するだけです。

使用法にもよりますが、分散データを扱う場合にのみuniqueidentifierの主キーを使用し、ほとんどのキー参照には古き良きINTIDENTITY列を使用します。

于 2009-01-23T01:51:42.997 に答える
1

この投稿をチェックしてください。異なるdbタイプですが、基本的に同じ問題です。デフォルトのフィールドをRoRから隠して、無効な挿入が生成されないようにする方法です。

@wayneを編集-コンラッドは古いリンクが死んでいると指摘した。内容は、 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
于 2009-01-23T01:59:27.050 に答える