2016-05-03 1 views
2

Ich habe gerade einen Postgres json Typ zu einer Rails/Active Record Tabelle hinzugefügt, mit der ich arbeite. Ich möchte einen Datensatz mit einem Standardwert in Rails Vorrichtungen füllen:Wie kann ich einen Postgres JSON-Wert in ein Rails-Gerät eingeben?

fixture_id: 
    existing_column: "foobar" 
    newly_added_column: <%= JSON.dump({:reason => 'foobar'}) %> 

Zuvor hatte ich Zeichenfolge JSON auf diese Weise in einer text Spalte gespeichert. Wenn ich diesen Unit-Test jetzt aber ausfühle:

test "my test" do 
    sut = fixtures(:fixture_id) 
    assert_not_nil sut.newly_added_column 
end 

Der Test schlägt fehl. Da es JSON auf Datenbankebene ist, denke ich nicht, dass es nützlich ist, es in eine Zeichenfolge zu speichern, aber die YAML-Fixtures scheinen ein Objekt nicht als Hash zu halten (wenn ich es ohne JSON.dump versuche, bekomme ich ActiveRecord::Fixture::FormatError: a YAML error occurred parsing).

Wohlgemerkt, ich benutze Rails 3, daher denke ich, dass einige der Unterstützung dafür in Rails 4 sein können, aber in Rails 3 funktioniert die Migration zum Hinzufügen eines json Postgres-Spaltentyps immer noch.

Antwort

3

Ich glaube, Ihre Befestigung kann so einfach sein wie:

fixture_id: 
    existing_column: foobar 
    newly_added_column: {'reason':'foobar'} 
1

Versuchen

fixture_id: 
    existing_column: "foobar" 
    newly_added_column: "{\"reason\": \"foobar\"}" 
1

Wenn Sie Active verwenden Inhalte für Ihre Vorrichtungen zu erzeugen, müssen Sie sicherstellen, dass es Attributwerte konvertiert zu Json. Wenn Sie sich auf die Standardserialisierung verlassen, wird Hash-Raketentext erzeugt, der YAML ungültig ist.

Zum Beispiel habe ich eine Legacy-Datenbank, die ich Befestigungen für meine neue Anwendung erstellen bin mit (einem entsprechenden Code unten aufgeführt):

presenter.rb

module FixturePresenter 
    def replacer(str) 
    str.downcase.tr(' ', '_').tr('-', '_') 
    end 

    # rubocop:disable Metrics/AbcSize 
    def plan 
    tag = replacer(name) + '_' + replacer(type) 

    <<~FIXTURE 
     #{tag}: 
     name: #{name} 
     type: #{type} 
     address: #{address} 
    FIXTURE 
    end 
end 

runner.rb

... 
Legacy::Provider.all.each_with_index do |p, i| 
    p.extend(FixturePresenter) 
    f.puts p.plan 
end 
... 

Die Adresse Spalte in der Plantabelle ist ein JSONB-Datentyp. Wenn wir diesen Code ausführen ist dies die resultierende YAML:

abc_plan_la_jolla: 
    name: ABC Plan La Jolla 
    type: default 
    address: {"street"=>"9888 Genesee Ave","unit"=>"","city"=>"La Jolla","state"=>"CA","postal_code"=>"92037"} 

Wenn Sie Ihren Test ausgeführt werden Sie das sehr traurig Syck Fehler:

Psych::SyntaxError: (<unknown>): did not find expected ',' or '}' while parsing a flow mapping at line 4 column 12 

Die folgende Änderung des Codes wird die richtige YAML produzieren :

Presenter.rb

address: #{address}-address: #{address.to_json}

Die obige Änderung eine glückliche Befestigungs Definition produzieren:

abc_plan_la_jolla: 
    name: ABC Plan La Jolla 
    type: default 
    address: {"street":"9888 Genesee Ave","unit":"","city":"La Jolla","state":"CA","postal_code":"92037"} 
0

lange JSON Struktur inline in Fixtures Um zu vermeiden, bieten YAML ein nützlichen > Betreiber

fixture_id: 
    existing_column: "foobar" 
    data: > 
    { 
     "can_edit": true, 
     "can_se": true, 
     "can_share": true, 
     "something_else": true 
    }