2016-05-03 11 views
0

Es tut mir sehr leid, wenn ich eine so triviale Frage posten, aber ich bin wirklich fest und Google konnte mir nicht helfen, vielleicht weil ich neu bei Ruby on Rails bin.Erstellen einer korrekten Abfrage mit Joins

Ich habe zwei Tabellen:
Person
id: Integer
name: String

Adresse
id: Integer
person_id: Integer
name: String

Ich möchte eineabrufenverbunden mit einem Address. Diese Code-Schnipsel funktioniert, aber nur, wenn es tatsächlich eine Adresse für diese Person zur Verfügung steht:

@person = Person.where('person.id' => params[:id]) 
       .joins(:address) 
       .select('person.id as id, address.id as aid, person.name as name, address.name as aname').first 

Meine Ansicht:

<h2><%= @person.name %></h2> 
<p><%= @person.aname %></p> 

Vielleicht ist ein m etwas konzeptionelles falsch zu machen. Wie ich schon sagte, sobald eine Person eine verwandte Address hat, zeigt meine Ansicht es, andernfalls, wenn es keine Address gibt, druckt es einen Fehler.

+0

Was ist der Fehler, den Sie bekommen haben? – Pavan

Antwort

2

Sie könnten die .includes(:relation) Methode verwenden, um eine LEFT OUTER JOIN Abfrage zu generieren. Ziehen Sie auch die Verwendung der Methode .find(:id) in Betracht, um nach einer Person mit einem bestimmten Primärschlüssel zu suchen. Dies wird Ihre Anfrage vereinfachen.

<h2><%= @person.name %></h2> 
<p><%= @person.address.try(:name) %></p> 

HINWEIS: Rufname- auf Adresse (@person.address.name) verletzt Law of Demeter und Sie sollten prüfen, indem

@person = Person.find(params[:id]).includes(:address) 

Auch Sie können Adressfelder aus Ihrer Sicht so nennen wollen eine address_name Methode zu Ihrer Person Klasse. In Schienen können Sie delegates :x, to: :y Syntax verwenden.

+0

Ok es scheint ein bisschen besser, danke für Ihre Antwort. Aber ich habe immer noch ein paar Probleme. Wenn ich '<% = @ person.address%>' kann ich sehen, dass es einige Attribute mit ihren Werten gibt (unter * raw_attributes *), aber wenn ich versuche, sie aufzurufen '<% = @ person.address.name% > 'ein Fehler erscheint:' undefinierter Methodenname 'für # Sylnois

+0

Haben Sie 'has_one' oder' has_many' Assoziation? Es sieht wie das spätere aus. Sie erhalten eine Liste von Adressen anstelle von nur einer. Ändern Sie "has_many: addresses" in "has_one: address". – Uzbekjon

+0

Ich habe es! Ich musste '@ person.address' wiederholen, auch wenn es nur einen Eintrag zurück gibt. Gibt es eine Möglichkeit, die Schleife loszuwerden, weil ich die Abfrage definieren möchte, so erhält es nur meine eine Adresse (ich werde ein boolesches Flag namens active in der Adresse hinzufügen, so dass nur eine Adresse aktiv ist) – Sylnois

Verwandte Themen