2013-06-04 14 views
7

So interessiert mich, wenn es eine Möglichkeit gibt, Zeichenfolge in aktive Record-Klasse zu konvertieren.Konvertieren String-Objekt in aktive Record-Klasse

Beispiel: Ich habe eine User Klasse, die von ActiveRecord::Base geerbt hat. Gibt es eine Möglichkeit, String zu User Klasse umwandeln kann, so kann ich ActiveRecord Methoden wie find, where usw.

Antwort

10

String#constantize eine Konstante kehrt mit dem angegebenen Namen. Für ist dies Ihre User Klasse:

"User".constantize 
# => User(id: integer, ...) 

Sie können dies einer Variablen zuweisen und Active Methoden aufrufen:

model = "User".constantize 
model.all 
# => [#<User id:1>, #<User id:2>, ...] 
+0

Um streng zu sein, gibt es jedes Objekt zurück, das an einen gegebenen konstanten Namen gebunden ist, nicht nur an Modul/Klasse. –

+0

@MarekLipka das ist richtig, ich habe meine Antwort aktualisiert. – Stefan

+0

Danke, genau das habe ich gesucht. –

3

Sie schreiben gerade in Sie Code

str="User" 
class_name=str.constantize 

und Sie werden get wie dieses Format Daten

User(id: integer, login: string, name: string, email: string, user_rank: integer 

Benutzer als Klassenname

zweite Methode ist class_name = Object.const_get (str)

1

sichere Weg:

"string".classify.constantize.find(....) 
1

Statt eine Methode in der String-Klasse definiert

 def constantize_with_care(list_of_klasses=[]) 
     list_of_klasses.each do |klass| 
      return self.constantize if self == klass.to_s 
      end 
     raise "Not allowed to constantize #{self}!" 
    end 

Verwenden Sie dann

"user".constantize_with_care([User]) 

und jetzt können Sie etwas tun, wie dieses

params[:name].constantize_with_care([User]) 

Ohne Sicherheitsproblem.