2014-02-11 5 views
12

Ich habe Ruby auf Schienen 4.0 und Postgresql 9.3.Ist es möglich, Postgresql 9.3 JSON-Typ in Zuordnungen (gehört_zu) als Foreign_key

Ich habe zwei Modelle:

class Person < ActiveRecord::Base 
     belongs_to :address_city, :class_name =>'City', :foreign_key => "address['city_id']" 
end 

class City < ActiveRecord::Base 
    has_many: :address_cities, :class => "Person", :foreign_key => "address['city_id']" 
end 

Feld address in Tabelle Person ist von JSON-Typ und city_id ist einer der möglichen Schlüssel in diesem JSON Feld.

Also, kann ich die Zuordnung zwischen zwei Modellen wie Person.first.address_city verwenden?

+0

Sie können keinen Fremdschlüssel in ein JSON-Feld erstellen, aber das heißt nicht, dass Rails das Modellieren einer Assoziation auf Anwendungsebene nicht unterstützt; Ich werde es für eine Rails-Person verlassen, um zu antworten. –

Antwort

5

Standardmäßig verwendet Rails den foreign_key auf der Seite angites_to, um eine SQL-Verknüpfung zwischen den beiden zugeordneten Tabellen auszuführen. Es wird also nicht in das JSON-Feld nach den foreign_key-Werten gesucht.

Sie könnten eine Association Extension erstellen, um in Ihr JSON-Feld zu schauen. Sie können hier in den Schienen Verbandsführer, wie man das tun: http://guides.rubyonrails.org/association_basics.html#association-extensions

Meiner Meinung nach ist dies gegen Schienen Konventionen, und Sie sollten das nicht tun. Stattdessen könnten Sie in der Personentabelle eine neue Spalte namens city_id anlegen. Dann führen Sie einen Job aus, der die Personentabelle wiederholt, um die city_id aus dem json zu extrahieren und die Spalte city_id zu aktualisieren. Danach können Sie eine normale 1 zu viele Verknüpfung zwischen der Tabelle Personen und Städte machen. Wenn ich wo du bin würde ich auch andere Felder extrahieren die ich vielleicht brauche. Dann können Sie in der Datenbank Indizes für die Geschwindigkeit hinzufügen.

Update:

In Rails 4.2 und Postgres können Sie json Inhalte direkt in eine Säule gegeben und dann können Sie es leicht abfragen, um die Postgres json Abfragesyntax in Schienen verwenden.

Also ich denke, Sie könnten diese Association Extension erstellen, die in den JSON-Inhalt aussehen könnte, obwohl ich das nicht empfehlen würde, weil es gegen Konventionen ist.

Referenzen:

Beispiel json Abfragen whith Schienen-Modellen: http://robertbeene.com/rails-4-2-and-postgresql-9-4/

Active Record json Datentyp: http://edgeguides.rubyonrails.org/active_record_postgresql.html#json

Postgres json Abfragesyntax: http://www.postgresql.org/docs/9.4/static/functions-json.html

+0

Wie würden Sie eine Assoziationserweiterung verwenden, damit AR ein JSON-Feld als Fremdschlüssel verwendet? –

0

Ich habe das hatte gleicher Fehler.

Im Moment gibt es Methoden, die Abfragen auszuführen, und es funktioniert für mich.

Mit Rails 4.2.6 und Postgres 9.5 es sollte wie folgt funktionieren:

class Person < ActiveRecord::Base 

    def address_city 
    City.find_by(id: address['city_id']) 
    end 

end 

class City < ActiveRecord::Base 

    def address_cities 
    Person.where(["(address->>'city_id')::int = ?", id]) 
    end 

end 

ich weiter untersucht habe mein Problem und Sequel ORM scheint zu lösen, dies zu unterstützen:

https://github.com/jeremyevans/sequel/blob/master/doc/association_basics.rdoc#associations-based-on-sql-expressions-options

verwenden Betrachten Sie es anstelle von Active Record, ich bin es in naher Zukunft tun

Verwandte Themen