2010-11-13 12 views
48

Für normale Spalten können Sie über die Klassenmethode columns erhalten. Assoziationen können jedoch etwas ganz anderes genannt werden, wenn die Option foreign_key in der Beziehungsmethode festgelegt ist. Zum BeispielSo erhalten Sie ActiveCord Assoziationen über Reflexion

class Post 
    has_many :comments, :foreign_key => :message_id # this is a contrived example 
end 

gegeben, wenn ich Post.column_names habe ich bei message_id bekommen könnte, aber ist es eine Möglichkeit, comments zu bekommen?

Antwort

76

Model.reflections gibt Informationen über die Assoziationen eines Modells. Es ist ein Hash, der auf dem Assoziationsnamen eingegeben wird. z.B.

Post.reflections.keys # => ["comments"] 

Hier ist ein Beispiel für einige der Informationen kann es für den Zugriff verwendet werden:


Hinweis

Post.reflections["comments"].table_name # => "comments" 
Post.reflections["comments"].macro # => :has_many 
Post.reflections["comments"].foreign_key # => "message_id" 
:
diese Antwort wurde aktualisiert, um zu decken Rails 4.2 basierend auf MCB ' s Antwort und die Kommentare unten. In früheren Versionen von Rails wurde stattdessen auf die Reflektion foreign_key zugegriffen unter Verwendung von primary_key_name, und die Schlüssel für die Reflektionen können Symbole anstelle von Strings sein, abhängig davon, wie die Assoziation definiert wurde, z. :comments anstelle von "comments".

+1

Genau das, was ich gesucht habe, danke :) –

+2

FYI Jungs, Reflexionen gibt nur einen Hash zurück, nicht ein HashWithIndifferentAccess. Die Schlüssel des Hashes .reflections sind also entweder ein Symbol oder eine Zeichenkette, je nachdem, was in der Modelldefinition steht. Das hat mich einfach gestolpert, weil ich dachte, es wäre entweder oder. – taelor

+0

Wie MCB in seiner Antwort in Rails 4.2 sagte, sagst du 'Post.reflections [" comments "]' stattdessen –

20

Für zukünftige Googler in Rails 4 wäre die Antwort jetzt:

Post.reflections[:comments].foreign_key # => "message_id" 

von hier genommen: https://stackoverflow.com/a/15364743/2167965

EDIT:

reflections, ab 4.2, jetzt Strings anstelle von Symbolen nimmt Das ist ein lustiger Bug zum Aufspüren. Wenn Sie weiterhin Symbole verwenden möchten, sollten Sie zu reflect_on_association(:assoc_name) wechseln. Beachten Sie auch reflections sind eigentlich the public api, die Dinge wie HABTM berichten wird, obwohl es alles unter der Haube hat. Die Reflexionen Rails ist tatsächlich verwenden, sind jetzt in _reflections

+12

Vielen Dank. Ich bin der zukünftige Googler. :) – epochwolf

-1

Für ein Active Objekt Ich verwende:

object._reflections 

Also, ich die Hash zurückgegeben manipulieren kann. Zum Beispiel:

object._reflections.keys.each do |key| 
    object.public_send(key).destroy_all 
end 

Im obigen Beispiel löschen Sie alle Beziehungen aus der Datenbank.

Verwandte Themen