2009-08-05 7 views
2

J'ai une classe d'enregistrement actifActiveRecord clé primaire est un varchar, erreur lors de l'enregistrement

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

myKey est un nvarchar (serveur SQL).

Lorsque je tente de l'enregistrer

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

J'obtiens l'erreur suivante:

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

Il semble que ActiveRecord pense que la clé primaire est une colonne d'identité (ce n'est pas son varchar) et ainsi échoue.

Existe-t-il un moyen de lui dire de ne pas essayer et de désactiver l'insertion d'identité?

MISE À JOUR

Il se trouve la version de l'adaptateur serveur sql enregistrement actif était à blâmer. J'avais précédemment utilisé 1.0.0.9250 mais en quelque sorte 2.2.19 a été installé (je présume quand faire une mise à jour de gemme). Après revenir à l'ancienne version, cela fonctionne très bien.

+0

Ce schéma existe-t-il? –

+0

oui, c'est un design de déchets, mais c'est la façon dont il doit être :) –

Répondre

0

Le problème particulier que je connaissais était dû à une mise à niveau de gem par inadvertance (heureusement en utilisant bundler maintenant cela n'arrive pas!).

L'ancien adaptateur de serveur sql d'enregistrement actif (1.0.0.9250) prend en charge ce que j'essayais d'accomplir.

4

ActiveRecord aime avoir des colonnes d'ID entières et lance un ajustement si ce n'est pas le cas. Il peut être coaché ​​pour traiter des alternatives, mais cela dépend de votre environnement.

Une alternative est d'avoir un champ ID basé sur un entier conventionnel, et un champ "clé" unique qui est utilisé pour les recherches.

class Service_Catalogue < ActiveRecord::Base 
    set_table_name "service_catalogue" 

    validates_uniqueness_of :myKey 
end 

S'il est possible, il peut être plus pratique de modifier votre schéma pour tenir ActiveRecord que l'entraîneur ActiveRecord pour traiter votre schéma. Sinon, vous pourriez avoir besoin de vraiment tomber et sale.

Une autre approche pourrait être d'utiliser un autre ORM comme DataMapper qui n'a pas les mêmes limitations.

+0

merci pour la suggestion. Malheureusement, c'est un système que je ne peux pas changer et que je dois utiliser AR. J'ai quand même trouvé la solution et j'ai mis à jour la réponse avec. –

Questions connexes