2009-06-25 8 views
2

Ruby on Rails ist sehr neu für mich. Ich versuche, eine Reihe von Spalten aus 3 verschiedenen Tabellen zu erhalten. Ich dachte, ich könnte die SQL-Ansicht verwenden, um meine Ergebnisse abzurufen, konnte jedoch keine Möglichkeit finden, Ansichten in Rails zu verwenden. Hier sind meine Tabellen. 1) Benutzertabelle -> Benutzername, Passwort und E-Mail 2) UserDetails Tabelle -> Fremdschlüssel: User_ID, Name, Adresse1, Stadt etc. 3) UserWorkDetails -> Fremdschlüssel: user_id, Arbeitsadresse1, work Typ usw.Wie mehrere Tabellen mit eins-zu-eins-Beziehungen in Schienen zu verbinden

Diese 3 Tabellen haben Beziehungen von eins zu eins. Somit gehört Tabelle 2 zu Tabelle 1 und Tabelle 3 gehört ebenfalls zu Tabelle 1. Tabelle 1 hat eine Benutzerdetails und eine Benutzerdetails.

Ich möchte Benutzer E-Mail, Name, Adresse1, Stadt, Arbeit Adresse1, Arbeitstyp mit Joins.

Was ist der beste Weg, damit umzugehen?

Antwort

2

zu bekommen, was Sie schnell die Verwendung gemacht werden sollen: include Option, um sowohl die anderen Tabellen, wenn Sie die primäre Tabelle abfragen, so: bei

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details]) 

Dies wird nur alle laden die Felder aus den Tabellen Sobald also nur eine Abfrage ausgeführt wurde, können Sie mit den Objekten tun, was Sie benötigen, da sie alle Benutzerdaten enthalten.

Ich finde, dass dies einfach genug und ausreichend ist, und damit optimieren Sie nicht zu früh, bevor Sie wissen, wo die Engpässe sind.

Allerdings, wenn Sie laden wollen wirklich nur die erforderlichen Felder verwenden, um die: wählen Sie die Option als auch auf der ActiveRecord::Base find Methode:

some_user_details = User.find(some_id, :include => [:user_details, :user_work_details], :select => "id, email, name, address1, city, work_address1") 

Obwohl meine SQL ein bisschen rostig im Moment ist.

-3

User.find(:first, :joins => [:user_work_details, :user_details], :conditions => {:id => id})

würde ich sagen, dass der Versuch, nur die Felder wählen Sie eine vorzeitige Optimierung an dieser Stelle ist, aber man konnte es in einem komplizierten tun: select Hash.

:include werden 3 Auswahlen, 1 für Benutzer, eine für user_details und eine für user_work_details. Es ist großartig, eine Sammlung von Objekten aus mehreren Tabellen in minimalen Abfragen auszuwählen.

http://apidock.com/rails/ActiveRecord/Base/find/class

4

Die Daten ist (sind) in den Modellen. Alles andere ist nur eine Optimierung. So steht Adresse1 beispielsweise unter user.user_detail.address1.

wenn Sie

class User 
    has_one :user_detail 
    has_one :user_work_detail 
end 
class UserDetail 
    belongs_to :user 
end 
class UserWorkDetail 
    belongs_to :user 
end 

Mit user_id Spalten in Tabellen mit dem Namen user_details und user_work_details dann alles andere für Sie erledigt. Wenn Sie später optimieren müssen, können Sie: die eigenen Modelle hinzufügen, aber es muss nicht alles funktionieren.

Verwandte Themen