2016-10-04 4 views
0

Ich habe einen Umfang Methode in Modell meines Kindes profile.rb definiert alsAufruf des Kindes Umfang durch Eltern

scope :fees_to, -> (fees_to) { where("fees_to <= ?", "#{fees_to}") } 

Und in der Eltern, die ist

gibt es tutor.rb folgt Konsole
has_one :profile, dependent: :destroy 

Jetzt in Schienen ich kann tun Profile.all.fees_to(10) zum Beispiel und seine Gültigkeit. Aber wie kann ich die fees_to Methode durch die Eltern Tutor anrufen?

Grundsätzlich jetzt bin ich in der Lage, durch meine profiles in der Indexansicht davon zu filtern. Aber was ich tun möchte, ist durch die tutor Indexansicht auf der Grundlage der Werte von dem Kind zu filtern.

Alle Hilfe und Beratung würde sehr geschätzt werden! Danke

+0

in Schienen-Konsole, 1, 'Tutors Tutor.first' = 2,' tutor.profile.fees_to (10) '. –

+0

@ 孙悟空 Das wird nicht funktionieren. 'tutor.profile' ist ein spezifisches Modell, das nicht auf' fees_to' reagiert. – meagar

+0

@meagar Sie haben Recht, QO kann eine Methode (nicht Umfang) in profile.rb 'def Gebühren_to (n) ...... Ende erstellen. dann 'tutor.profile.fees_to (10)'. –

Antwort

0

Dies macht keinen Sinn mit einem has_one. Sie können nicht "einen" haben und trotzdem einen Gültigkeitsbereich darauf anwenden. Bereiche arbeiten an viele Datensätze, um zusätzliche Bedingungen anzuwenden und die Ergebnismenge einzugrenzen, nicht bestimmte Datensätze.

Sie versuchen effektiv eine where(fees_to < ?) Bedingung zu einem spezifischen Datensatz hinzuzufügen, was offensichtlich keinen Sinn macht.

Wenn Sie einen Bereich über eine Zuordnung verwenden möchten, muss es sich um eine has_many handeln.

+0

vorausgesetzt, ich ändere es zu has_many, wie werde ich es tun. Wenn es in meinem Tutor heißt.rb' es ist 'has_many: profiles' anstatt, würde so etwas wie' tutor = Tutor.all' gefolgt von 'tutor.profiles.fees_to (10)' funktionieren? – angkiki

+0

@angkiki Nein, du würdest 'tutor = Tutor.first; tutor.profiles.fees ... '.Sie können keine Assoziation für eine Sammlung von Modellen nur für ein bestimmtes Modell aufrufen. Damit 'tutor.profiles.fees_to (10)' funktioniert, muss 'tutor' ein ** spezifischer Datensatz ** sein, und' profiles' müssen eine * Sammlung * von Datensätzen sein, dh ein 'has_many'. – meagar

+0

Bedeutet das, dass ich auf keinen Fall in meinem Eltern-Index nach meinem Kind suchen oder filtern kann? Oder gibt es eine Methode, nur dass ich einen völlig falschen Ansatz nehme? – angkiki

0

In profile.rb: Sie können eine Funktion wie erstellen:

def fees_to n 
    Profile.fees_to(n) # your scope is called here 
end 

Dann in Schienen Konsole:

tutor = Tutor.first 
tutor.profile.fees_to(10) 

es funktioniert wie ein Filter. Wenn Profile fees_to>n ist, werden Sie [] (Array leer)

AKTUALISIERT erhalten

bad => @tutor = Tutor.all 
good => @tutor = Tutor.includes(:profile).all # with eager loading, avoid n+1 query. 

sein können Sie Schleife so machen wollen:

@tutor.each do |tutor| 
    tutor.profile.fees_to(10) 
end 
+0

Das würde nur funktionieren, wenn ein Tutor richtig ausgewählt wurde. Also, in meinem Tutor-Index, wenn ich @tutor = Tutor.all mache, wie implementiere ich die Methode darauf? – angkiki

+0

Nach '@tutor = Tutor.includes (: profile) .all' ist' @ tutor' kein einzelnes Objekt. Es ist eine Sammlung von Tutoren. Methode Gebühren_aufrufen nur von einzelnen Objekt aufgerufen werden. Du brauchst also eine Schleife wie diese: '@tutor.each do | tutor | tutor.profile.fees_to (10) end' Ich habe meine Antwort aktualisiert –

0

definiert ich folgendes in mein tutor.rb

def self.fees_search(n) 
    @profile = Profile.fees_to(n) 
    if @profile.empty? 
     return Tutor.none 
    else 
     @profile.each do |y| 
     y.tutor 
     end 
    end 
    end 

Nicht sicher, ob es klobig ist oder wenn es Redundanzen gibt, aber es funktioniert einwandfrei in der Rails-Konsole. Ich kann Tutor.fees_search(10) tun und es macht alle entsprechenden Tutoren entsprechend.

Prost

Verwandte Themen