2016-10-05 4 views
0

In meinem Modell subject.rb ich habe dieManipulieren gesuchte Objekt (Kind) in (parent) Modell

definiert folgende
has_many :tutors, through: :profiles  

    def self.search(param) 
    where("name like ?", "%#{param}%") 
    end 

So etwas wie Subject.search("English") funktioniert perfekt in Ordnung in Schienen-Konsole.

Was ich gerne wissen würde ist, dass, wenn ich subject = Subject.first tun und ich Sachen wie subject.id tun kann und es die Subjekt-ID an mich zurückgibt. Während

wenn ich subject = Subject.search("English") tun bin ich nicht in der Lage etwas wie subject.id

zu tun, weil ich versuche, die Suchfunktion zu meinem tutor.rb Modell mit dem folgenden Code zu verknüpfen.

def self.subject_search(s) 
    @tutor = Tutor.all 
    @tutor.each do |x| 
    y = x.subjects.search(s) 
    unless y.empty? 
     return x 
    end 
    end 
end 

Das funktioniert, aber nur einen Tutor und nicht alle Tutoren, die das Thema haben.

Ich habe auch versucht, diese stattdessen

def self.subject_search(s) 
    @subject = Subject.search(s) 
    if @subject 
     @subject.tutors 
    end 
    end 

Aber das ist, wenn ich merkte @ subject.tutors nicht funktioniert, wie oben erklärt, wenn i subject = Subject.search("English") ich nicht subject mit allen möglichen Methoden manipulieren kann.

Was mache ich falsch?

+0

Sie können Fehler selbst finden, wenn Sie versuchen, Subject.search ("Englisch") anzuzeigen. Class! = Modell Betreff aber Array oder ... –

+0

Ja ich bin mir bewusst, dass wenn ich 'Subject.search (" Englisch ")' es sagt etwas in Richtung der ActiveRecord_Relation. Aber was ich nicht verstehe ist, was ich stattdessen tun sollte? – angkiki

Antwort

0

Mit #where wird ein Array von Objekten zurückgegeben, die die Kriterien erfüllen.

Subject.search('Math') => ['Math1', 'Math2', 'Math3'] # Objects of course

In Ihrem Fall sollten Sie Subject.find_by_name('English') tun, die das erste Objekt erfüllen Ihre Abfrage zurückgibt. Dann können Sie #tutors auf Ihrem Subject Modell aufrufen, vorausgesetzt, Sie haben die Methode definiert.

Wenn Sie den Operator like verwenden müssen, egal was (was ich nicht empfehlen), hier ist, was passieren wird.

s = Subject.search('En') # => ['English', 'Environmental Science', ..] 
s.tutors # => Undefined method tutors for Array class 

Hier s ist ein Array von Subject Modelle eher als eine singuläre Subject die der Grund, warum seine nicht funktioniert. Entweder brauchst du etwas, um es einzugrenzen oder es durchzuschleifen, was sowieso nicht das ist, was du willst.

+0

Ich verstehe deine Antwort nicht ganz. Denkst du, du könntest es ausarbeiten? Ich verstehe nicht, warum 'Subject.find (" English ")' auch funktionieren würde. – angkiki

+0

Sorry, es sollte 'Subject.find_by_name ('English')' 'sein. Ich habe meine Antwort aktualisiert – Jeff

+0

Wie bereits erwähnt, gibt die 'find' Methode nur ein Objekt zurück, während die' where' Methode ein Array von Objekten zurückgibt, die die Bedingung erfüllen. Der einzige Nachteil ist, dass Sie so etwas wie 'Subject.find_by_name ('Englis') 'nicht machen können und ein Ergebnis erwarten. – Jeff

Verwandte Themen