2010-11-13 7 views
48

Pour les colonnes normales, vous pouvez y accéder via la méthode de classe columns. Toutefois, les associations peuvent être nommées quelque chose de très différent si l'option foreign_key est définie dans la méthode de relation. Par exemple, étant donnéComment obtenir des associations activerecord par réflexion

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

si je ne Post.column_names que je pouvais obtenir à message_id, mais est-il possible d'obtenir comments?

Répondre

76

Model.reflections donne des informations sur les associations d'un modèle. C'est un Hash entré sur le nom de l'association. par exemple.

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

Voici un exemple de certaines des informations qu'il peut être utilisé pour accéder à:

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

Note: cette réponse a été mis à jour pour couvrir Rails 4.2 basé sur MCB ' s réponse et les commentaires ci-dessous. Dans les versions antérieures de Rails, la valeur foreign_key de la réflexion a été accédée en utilisant primary_key_name à la place, et les clés pour les réflexions peuvent être des symboles au lieu de chaînes selon la façon dont l'association a été définie, par ex. :comments au lieu de "comments".

+1

Exactement ce que je cherchais, merci :) –

+2

Pour les gars, les réflexions renvoie juste un hachage, pas un HashWithIndifferentAccess. Ainsi, les clés du hachage .reflections seront soit un symbole, soit une chaîne, selon ce qu'il dit dans la définition du modèle. Cela m'a juste fait trébucher en pensant que ce serait ou. – taelor

+0

Comme MCB a dit dans sa réponse, dans Rails 4.2, vous dites 'Post.reflections [" comments "]' à la place –

20

Pour les futurs Googlers dans Rails 4 la réponse serait maintenant:

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

Taken from here: https://stackoverflow.com/a/15364743/2167965

EDIT:

reflections, au 4.2, prend maintenant des chaînes au lieu des symboles qui est un bug amusant à traquer. Si vous souhaitez continuer à utiliser des symboles, vous devez passer à reflect_on_association(:assoc_name). En outre, notez reflections sont en fait the public api qui continuera à rapporter des choses comme HABTM, même si tout a beaucoup à travers le capot. Les réflexions Rails utilise réellement sont maintenant en _reflections

+12

Merci beaucoup. Je suis le futur googleur. :) – epochwolf

-1

Pour un objet ActiveRecord J'utilise:

object._reflections 

Donc, je peux manipuler le Hash retourné. Par exemple:

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

L'exemple ci-dessus supprime toutes les relations de la base de données.

Questions connexes