Как получить ассоциации активных записей через рефлексию - PullRequest
53 голосов
/ 13 ноября 2010

Для обычных столбцов вы можете получить их с помощью метода класса columns. Однако ассоциации могут быть названы как-то совсем иначе, если в методе отношений установлена ​​опция foreign_key. Например, учитывая

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

если бы я сделал Post.column_names, я мог бы добраться до message_id, но есть ли способ получить comments?

Ответы [ 3 ]

84 голосов
/ 13 ноября 2010

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".

21 голосов
/ 03 января 2014

Для будущих Googlers в Rails 4 ответ будет теперь:

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

взято отсюда: https://stackoverflow.com/a/15364743/2167965

EDIT:

reflections, начиная с 4.2, теперь принимает строки вместо символов, что является забавной ошибкой для отслеживания. Если вы хотите продолжать использовать символы, вы должны переключиться на reflect_on_association(:assoc_name). Также обратите внимание, что reflections на самом деле общедоступный API , который будет продолжать сообщать о таких вещах, как HABTM, даже несмотря на то, что все это имеет множество проблем. Отражения, которые фактически использует Rails, теперь находятся в _reflections

0 голосов
/ 09 марта 2016

Для объекта ActiveRecord я использую:

object._reflections

Итак, я могу манипулировать возвращаемым хэшем.Например:

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

Приведенный выше пример удаляет все связи из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...