2009-08-05 5 views
2

Spar I haben eine aktive DatensatzklasseActiveprimärschlüssel ist ein VARCHAR Fehler, wenn

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

myKey ist ein nvarchar (SQL-Server).

Wenn ich versuche, und speichern Sie es

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

Ich erhalte die folgende Fehlermeldung:

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

Es ist wie Active scheint der Meinung, dass der Primärschlüssel ist eine Identitätsspalte (es ist nicht seine ein varchar) und so versagt.

Gibt es eine Möglichkeit, es zu sagen, nicht zu versuchen, Identität einfügen zu deaktivieren?

UPDATE

Es stellt sich die Version des aktiven Datensatzes SQL Server Adapter schuld war, um. Ich hatte zuvor 1.0.0.9250 verwendet, aber irgendwie 2.2.19 wurde installiert (ich nehme an, wenn ein Edelstein Update). Nach der Rückkehr zur alten Version funktioniert es gut.

+0

Ist dieses Legacy-Schema? –

+0

Ja, es ist ein Müll Design, aber so muss es sein :) –

Antwort

0

Das spezielle Problem, das ich erlebte, wurde wegen einer versehentlichen Edelsteinaktualisierung verursacht (zum Glück, Bundler verwendend, tut dies jetzt nicht!).

Der alte Active Record SQL Server Adapter (1.0.0.9250) unterstützt, was ich erreichen wollte.

4

ActiveRecord hat gerne Integer-ID-Spalten und löst eine Anpassung aus, wenn dies nicht der Fall ist. Es kann trainiert werden, mit Alternativen umzugehen, aber das hängt von Ihrer Umgebung ab.

Eine Alternative besteht darin, ein herkömmliches ganzzahliges ID-Feld und ein eindeutiges "Schlüssel" -Feld zu haben, das für Nachschlagevorgänge verwendet wird.

class Service_Catalogue < ActiveRecord::Base 
    set_table_name "service_catalogue" 

    validates_uniqueness_of :myKey 
end 

Wenn es möglich ist, könnte es bequemer sein, das Schema zu ändern Active zu passen als zu Trainer Active mit Ihrem Schema zu beschäftigen. Wenn nicht, müssen Sie vielleicht wirklich schmutzig werden.

Ein anderer Ansatz könnte darin bestehen, einen alternativen ORM wie DataMapper zu verwenden, der nicht dieselben Einschränkungen aufweist.

+0

danke für den Vorschlag. Leider ist dies ein System, das ich nicht ändern kann und muss AR verwenden. Ich habe die Lösung trotzdem gefunden und habe die Antwort damit aktualisiert. –

Verwandte Themen