2012-04-10 16 views
1

aktuellen Codebekommen ID von Activerecord Modell

@current_site_name = 'SITENAME' 
@current_site = Site.where(:name => @current_site_name) 
@current_site_id = @current_site.id 

Grundsätzlich ist die name Säule in unserem Site Modell ist einzigartig. Wir wählen eine Zeile mit dem Site-Namen als Parameter aus.

Ich bin zurückgekehrt: <ActiveRecord::Relation:0x59426bc1>

Ich verstehe, dass ich nicht einfach für @current_site.id fragen können, aber ist es eine Möglichkeit, die ID des einzelnen Active in die Variable @current_site_id

wieder zu setzen, wird es immer sein Aktiver Rekord.

Antwort

3

Wie Sie gesehen haben, gibt where eine ActiveRecord::Relation (eine Reihe von Zeilen) zurück, auch wenn nur eine Zeile Ihren Kriterien entspricht. Sie können machen @current_site der Zeile zugewiesen werden Sie durch Ändern der Linie dazu wollen:

@current_site = Site.where(:name => @current_site_name).first 
+0

Ich dachte, ich versuchte das, aber ich glaube, ich hatte '.first!' - bleh, es ist immer einfach. Vielen Dank. – stewart715

+0

Das ist definitiv einfacher als mein Ansatz – iGbanam

0

Hmm ... Das ist ganz merkwürdig.

Site.where(:name => @current_site_name).methods.include? :id #=> false 

aber

Site.where(:name => @current_site_name).instance_methods.include? :id #=> true 

jedoch

Site.where(:name => @current_site_name).instance_eval "id" #=> NameError 

und

Site.where(:name => @current_site_name).methods.include? "self.id" #=> NoMethodError 

Das heißt, eine Abhilfe in Ihrem Fall unter der Annahme, nur ein Datensatz zurückgegeben werden sollte, ist

Site.where(:name => @current_site_name).instance_eval('find_first').id 

Die find_first Methode ist protected so müssen wir Umfang in seiner Ausführung springen andere NoMethodError

0

Nur um zu vermeiden, eine andere Lösung gibt, zu werfen, Sie können von Rails' dynamic finders machen, die für Ihre Modelle erstellt werden .

@current_site = Site.find_by_name(@current_site_name) 

Dies gibt einen einzelnen Datensatz (und somit nicht die Verwendung von first erfordert) und vielleicht in einigen Leuten Meinung als saubereren Code zu sehen.

Verwandte Themen