2009-08-05 11 views
2

を保存するとき、私は、アクティブレコードクラスを持っているActiveRecordの主キーがvarchar型で、エラー

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

MYKEYのデータ型はnvarchar(SQLサーバー)です。

私は試してみて、それを

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のは、主キーがID列であると考えているように思え(それはそのvarchar型ではありません)そうではありません。

アイデンティティ挿入を無効にしないように指示する方法はありますか?

UPDATE

これは、アダプタが非難したアクティブレコードSQL Serverのバージョンが判明。 以前は1.0.0.9250を使っていましたが、なんとか2.2.19がインストールされていました(私は宝石の更新を行う時に推測します)。古いバージョンに戻った後、正常に動作します。

+0

このレガシースキーマはありますか? –

+0

ええ、そのゴミのデザインが、それはそれがする必要がある方法です:) –

答えて

0

私が経験していた特定の問題は、不注意な宝石のアップグレードのために発生しました(これはうまくいきませんでした!

古いアクティブレコードSQLサーバーアダプター(1.0.0.9250)は、達成しようとしていたものをサポートしています。

4

ActiveRecordは整数のID列を持つのが好きで、そうでない場合はフィットをスローします。代替案を扱うためにコーチングすることもできますが、これは環境によって異なります。

代替方法としては、従来の整数ベースのIDフィールドと、ルックアップに使用される一意の「キー」フィールドを使用する方法があります。それが可能だ場合

class Service_Catalogue < ActiveRecord::Base 
    set_table_name "service_catalogue" 

    validates_uniqueness_of :myKey 
end 

、あなたのスキーマに対処するためにコーチのActiveRecordよりもActiveRecordのに合わせて、あなたのスキーマを変更する方が便利かもしれません。そうでない場合は、実際に下って汚れている必要があります。

もう1つのアプローチは、同じ制限を持たないDataMapperのような代替ORMを使用することです。

+0

提案のおかげで。残念ながら、これは私が変更することはできず、ARを使用する必要があるシステムです。 私はこのソリューションをとにかく見つけ、その答えを更新しました。 –