2016-04-28 11 views
0

Normalerweise, wenn wir Activebezogene Objekt verwenden müssen, schreiben wir einen solchen Code:Wie kann ich in Ruby on Rails ActiveRecord auf zugehöriges Objekt nach String-Feldnamen zugreifen?

main_object.related_object 

Wo main_object ist Instanz von MainObject Klasse und related_object ist Instanz von RelatedObject, die über related_object_id Feld MainObject verbunden:

class MainObject < ActiveRecord::Base 
    :has_one => :related_object 
end 

class RelatedObject < ActiveRecord::Base 
    :belongs_to => :main_object 
end 

Anzahl der Beziehungen kann unterschiedlich sein und mehr als eins. Auch meine Aufgabe setzt benutzerdefinierte Abfragen voraus, bei denen ich nicht weiß, welche eine Beziehung verwendet wird.

Also, ich mag damit verbundene Ziel über seinen Namen erhalten, zum Beispiel:

main_object.relations['related_object'] 

Ist es möglich, in Ruby on Rails Activerecord?

+0

Ich denke, es wie Polymorphismus scheint, aber in Richtung zurück .... und in meiner Vision ist es derzeit nicht möglich, mit nur Schienen, denn um zu erzeugen eine richtige Abfrage Schienen wissen nicht, Name eines Modells zu beziehen –

+0

Aber könnten Sie die Aufgabe zu erklären, wissen Sie nicht einen Modellnamen der Beziehung, oder Sie wissen nicht nur eine feste Beziehung Name? –

+0

Ja, ich weiß nicht feste Beziehung Name Modell kann mehrere Beziehungen haben, und verschiedene Beziehungen werden in verschiedenen Fällen verwendet werden –

Antwort

1

können Sie public_send verwenden

main_object.public_send(:related_object)

+0

Danke, aber 'public_send'doesnicht mit Beziehungen helfen :( –

+1

Ja, tut es.' Has_many '' gehört_to' usw. sind nur Klassenmethoden, die Instanzmethoden zur Klasse hinzufügen. –

+0

Oh, tut mir leid. Es funktioniert, ich habe es beim ersten Mal falsch benutzt - setze stattdessen eckige Klammern. Aber dank meinem Fehler habe ich eine andere Lösung gefunden als Antwort! –

0

ActiveRecord Objekte hat association Methode gibt Zuordnungsinformationen für Namen. Es zurückkehren ActiveRecord::Associations::* Klasse-Instanz, die target Methode enthält:

association = main_object.association :related_object 
association.target # returns RelatedObject instance that I wanted