Как да получите асоциации на активен запис чрез отражение

За нормалните колони можете да стигнете до тях чрез метода на класа columns. Въпреки това, асоциациите могат да бъдат наречени нещо съвсем различно, ако опцията foreign_key е зададена в метода на връзката. Например дадено

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

ако направих Post.column_names, можех да стигна до message_id, но има ли някакъв начин да получа comments?


person Matt Briggs    schedule 13.11.2010    source източник


Отговори (3)


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

person mikej    schedule 13.11.2010
comment
За информация, момчета, отраженията просто връщат хеш, а не HashWithIndifferentAccess. Така че ключовете на хеша .reflections ще бъдат или символ, или низ, в зависимост от това какво пише в дефиницията на модела. Това просто ме накара да си помисля, че ще бъде или или. - person taelor; 02.04.2012
comment
Както каза MCB в своя отговор, в Rails 4.2 казвате Post.reflections["comments"]вместо това - person Asfand Qazi; 10.04.2015
comment
благодаря @AsfandYarQazi - актуализирах отговора, за да включа разликите за Rails 4.2+ - person mikej; 12.04.2015
comment
вашият отговор ми помогне да подобря събирането на информация за базата данни на Rails: gist.github.com/r72cccp/3480f4e13f00d54d4cb87bfd40 77c8aa - person Sergio Belevskij; 20.08.2016

За бъдещите служители на Google в Rails 4 отговорът сега ще бъде:

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

Взето от тук: https://stackoverflow.com/a/15364743/2167965

РЕДАКТИРАНЕ:

reflections, считано от 4.2, вече приема низове вместо символи, което е забавна грешка за проследяване. Ако искате да продължите да използвате символи, трябва да преминете към reflect_on_association(:assoc_name). Също така имайте предвид, че reflections всъщност са публичният API, който ще продължи да отчита неща като HABTM, въпреки че всичко това има много проходи под капака. Отраженията, които Rails всъщност използва, сега са в _reflections

person MCB    schedule 03.01.2014

За обект ActiveRecord използвам:

object._reflections

Така че мога да манипулирам върнатия хеш. Например:

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

Горният пример изтрива всички релации от базата данни.

person Lucivaldo Castro    schedule 09.03.2016
comment
Не се препоръчва използването на подчертани методи на Rails, те могат да се променят по всяко време без предупреждение, което ще причини грешки при надграждане - person camilo.forero; 18.10.2019