web-dev-qa-db-ja.com

リフレクションを介してアクティブレコードの関連付けを取得する方法

通常の列の場合、columnsクラスメソッドを介して取得できます。ただし、アソシエーションは、foreign_keyオプションが関係メソッドで設定されています。たとえば、

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

私がした場合Post.column_namesで得ることができましたmessage_idですが、commentsを取得する方法はありますか?

54
Matt Briggs

Model.reflectionsは、モデルの関連付けに関する情報を提供します。これは、関連付け名にキーが付けられたHashです。例えば.

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

アクセスに使用できる情報の例を以下に示します。

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

注:この回答は、Rails 4.2に基づいて [〜#〜] mcb [〜#〜] の回答と以下のコメント。以前のバージョンのRailsリフレクションのforeign_keyは、代わりにprimary_key_nameを使用してアクセスされ、キー反射は、関連付けがどのように定義されたかに応じて、文字列ではなくシンボルになる場合があります。たとえば、:commentsではなく"comments"です。

84
mikej

Rails 4の将来のGoogle社員の場合、答えは次のようになります:

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

ここから取得: https://stackoverflow.com/a/15364743/2167965

編集:

reflectionsは4.2以降、シンボルではなく文字列を取得するようになりました。これは追跡するのが楽しいバグです。シンボルを使い続けたい場合は、reflect_on_association(:assoc_name)に切り替える必要があります。また、reflectionsは実際には public api であることに注意してください。 Railsが実際に使用している反射が__reflections_になりました

21
MCB