Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get activerecord associations via reflection

For normal columns, you can get at them via the columns class method. However, associations may be named something quite different if the foreign_key option is set in the relationship method. For example, given

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

if I did Post.column_names I could get at message_id, but is there any way to get comments?

like image 600
Matt Briggs Avatar asked Nov 13 '10 15:11

Matt Briggs


1 Answers

Model.reflections gives information about a model's associations. It is a Hash keyed on the association name. e.g.

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

Here is an example of some of the information it can be used to access:

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

Note: this answer has been updated to cover Rails 4.2 based on MCB's answer and the comments below. In earlier versions of Rails the reflection's foreign_key was accessed using primary_key_name instead, and the keys for the reflections may be symbols instead of strings depending on how the association was defined e.g. :comments instead of "comments".

like image 83
mikej Avatar answered Oct 14 '22 14:10

mikej