2016-03-22 15 views
1

Ich habe folgenden Code in meine Modelle:Exact Zugordnungseintrag mit has_many durch

class Investment < ActiveRecord::Base 
    has_many :investment_datas 
    has_many :investors, through: :investment_datas, source: :investor 

class Investor < ActiveRecord::Base 
    has_many :investment_datas 
    has_many :investments, through: :investment_datas, source: :investment 

class InvestmentData < ActiveRecord::Base 
    belongs_to :investor 
    belongs_to :investment 

Ich habe einige Felder in InvestmentData, die ich für bestimmte Investor und Investment zugreifen möchten. Zum Beispiel wie folgt aus:

investor.investments.first.investment_data 

Es gibt einen Fehler:

NoMethodError undefined method 'investment_data' for #<Investment:0x000000070f3028> 

Wo investment_data ist die InvestmentData Aufzeichnung, die investor und investments.first Aufzeichnungen verbindet. Wie kann ich dies mit ActiveRecord erreichen? Oder sollte ich mit Roh-SQL gehen?

+0

erweitern Bitte auf "es funktioniert nicht, obwohl". Was genau passiert *? Gibt es die falschen Daten zurück? Gibt es nichts zurück? Gibt es einen Fehler? – jeffdill2

+0

Genau. Kein Methodenfehler – starwars25

+0

Bitte fügen Sie den genauen Fehler in Ihre Frage ein. – jeffdill2

Antwort

0

Sie sagte:

Where investment_data is the InvestmentData record which connects investor and investments.first records.

Dann können Sie tun:

InvestmentData.where(investor_id: investor.id, investment_id: investments.first.id).first 
# or 
investor.investment_datas.where(investment_id: investments.first.id).first 
# or 
investments.first.investment_datas.where(investor_id: investor.id).first 
+0

Diese Lösung erzeugt ein N + 1 Problem, weil ich Daten in '.each' Schleife anzeigen muss – starwars25

+0

nichts blockiert Sie vor dem eifrigen Laden der Beziehungen vor der Schleife @ starwars25 – MrYoshiji

+0

Wenn ich das tue, werden die Ergebnisse der ersten Abfragen zwischengespeichert und verwendet in folgenden Abfragen? – starwars25