4 Stimmen

Hinzufügen einer Spalte zu einem Modell zur Laufzeit (ohne zusätzliche Tabellen) in Rails

Ich versuche, Administratoren meiner Webanwendung die Möglichkeit zu geben, einige neue Felder zu einem Modell hinzuzufügen. Das Modell heißt Artwork und ich würde gerne zur Laufzeit eine test_column Spalte hinzufügen. Ich bin gerade am Testen, also habe ich einen einfachen Link hinzugefügt, um das zu tun, es wird natürlich parametrisch sein.

Ich habe es durch Migrationen geschafft:

  def test_migration_create  
   Artwork.add_column :test_column, :integer
    flash[:notice] = "Added Column test_column to artworks"
    redirect_to :action => 'index'
  end

  def test_migration_delete
    Artwork.remove_column :test_column
    flash[:notice] = "Removed column test_column from artworks"
    redirect_to :action => 'index'
  end

Es funktioniert, die Spalte wird ohne Probleme zur Datenbank hinzugefügt oder aus ihr entfernt. Ich verwende im Moment active_scaffold, so dass ich das Feld test_column im Formular erhalte, ohne etwas hinzuzufügen. Wenn ich jedoch eine Erstellung oder Aktualisierung übermittle, wird die Spalte test_column nicht aktualisiert und bleibt leer. Wenn ich mir die Parameter ansehe, kann ich sehen:

Parameters: {"commit"=>"Update", "authenticity_token"=>"37Bo5pT2jeoXtyY1HgkEdIhglhz8iQL0i3XAx7vu9H4=", "id"=>"62", "record"=>{"number"=>"test_artwork", "author"=>"", "title"=>"Opera di Test", "test_column"=>"TEEST", "year"=>"", "description"=>""}}

der Parameter test_column wird korrekt übergeben. Warum ignoriert active record ihn dann? Ich habe auch versucht, den Server neu zu starten, ohne Erfolg.

Ich verwende Ruby 1.8.7, Rails 2.3.5 und Mongrel mit einer Sqlite3-Datenbank.

Danke

1voto

John Douthat Punkte 39886

In der Entwicklungsumgebung laden die ActiveRecord-Modelle ihre Metadaten bei jeder Anfrage neu. In der Produktionsumgebung werden die Metadaten jedoch beim Start zwischengespeichert, so dass alle von Ihnen hinzugefügten Spalten erst nach einer Aktualisierung der Metadaten zugänglich sind.

Außerdem erfordert das Ändern einer Tabelle in der Regel eine exklusive Tabellensperre, während die Daten neu geschrieben werden, was die Leistung Ihrer Website erheblich beeinträchtigen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X