Wie kann ich eine Datenbankspalte in meiner ActiveRecord :: Base-Klasse dauerhaft ignorieren?

7

Ich habe eine Legacy-Datenbank, die ich mit Rails zu modellieren versuche. Eine der Tabellen hat eine Spalte mit dem Namen attributes , was ein Name ist, den ich von Rails reserviert habe.

Hier ist das SQL für die Tabelle:

%Vor%

Hier ist meine ActiveRecord-Klasse:

%Vor%

Folgendes passiert, wenn ich versuche, eine Instanz zu instanziieren:

%Vor%

Es sieht so aus, als ob der attributes Name reserviert ist. Daher würde ich gerne eine Möglichkeit finden, ihn für alle Abfragen zu ignorieren und AR zu ignorieren, wenn er über das Schema nachdenkt, um die Modellklasse zu definieren. Irgendwelche Vorschläge? Danke!

    
hornairs 06.02.2011, 02:40
quelle

3 Antworten

9

Gelöst dies mit einer Kombination von Sachen von Robins Link und einigen anderen SO Antworten

%Vor%

Hat den Trick gemacht. Ich habe eine große, umfassende Änderung verwendet, um "true" zurück zu geben, ohne einen Fehler für alle Methoden zu erzeugen, die mit attributes beginnen, und ich denke nicht, dass dies an anderer Stelle Probleme verursacht hat.

    
hornairs 06.02.2011, 16:43
quelle
9
%Vor%

Dieser Patch ist in Ordnung und funktionierte hauptsächlich für mich, aber wenn Sie etwas überprüfen Album.Column_names und Album.columns.collect (& amp;: name) würden Sie immer noch alle Spalten erhalten. Auch das würde scheitern.

%Vor%

Damit Schienen eine Spalte vollständig ignorieren, können Sie dies tun.

%Vor%

Ich habe auch ein Array verwendet, um die Spalten zu speichern, die ich nicht haben wollte, aber Sie könnten immer noch den Regex-Weg benutzen! Jetzt können Sie die Spalte nur mit connection ie.

aufrufen %Vor%     
earlonrails 25.04.2012 16:31
quelle
3

(Dies ist eine alte Frage, die aber immer noch in Google auftaucht, also füge ich eine verspätete Antwort hinzu)

Ich habe herausgefunden, dass die beste Möglichkeit zum Beschränken von Daten, die von einem ActiveRecord-Modell geladen werden, darin besteht, eine Datenbankansicht zu erstellen, die nur die Spalten enthält, die Sie laden möchten. Sie können Ihr ActiveRecord-Modell auf die eingeschränkte Ansicht verweisen, indem Sie die Tabellenname -Methode von ActiveRecord verwenden. Native SQL-Tools können die zugrunde liegende Tabelle zwar weiterhin bearbeiten, ActiveRecord kann jedoch nur die explizit in der Ansicht enthaltenen Spalten anzeigen (und folglich auch laden).

    
Ivar 15.05.2015 23:44
quelle