2012-09-07 15 views
13

Chcę znać nazwę pola odpowiadającą podpisowi tabeli dla danego modelu w Railsach.Uzyskaj pole klucza obcego ze skojarzeń w Railsach

Wyświetlam napisy przy użyciu modelu zapytania.

query.columns.map {| q | q.caption}
=> [ "Tracker", "Stan", "Priorytet", "Temat", "Nabywca", "Wersja docelowa", "Termin", "% gotowe"]

Kolumna ma nazwy odpowiadającej podpisy

query.columns.map {| q | q.name}
=> [: tracker,: status: priorytet: Temat,: assigned_to,: fixed_version,: DUE_DATE,: done_ratio]

Mój model wygląda

Issue.columns.map {| q | q.name}
=> ["id", "tracker_id", "project_id", "subject", "description", "due_date", "category_id", "status_id", "reserved_to_id", "priority_id", " fixed_version_id”, "author_id", "created_on", "updated_on", "data_początkowa", "done_ratio", "estimated_hours", "parent_id"]

chcę uzyskać nazwę pola (nazwa pola db) odpowiadające podpisowi z powyższych informacji.

stowarzyszenie próbki w modelu

belongs_to :assigned_to, :class_name => 'Principal', :foreign_key => 'assigned_to_id' 

Więc dla powyższego stowarzyszenia chcę wiedzieć, klucz obcy.

dla assigned_to chcę 'assigned_to_id'

Odpowiedz

15

reflections hash posiada tego rodzaju informacji:

Issue.reflections['assigned_to'].foreign_key 

można również uzyskać inne informacje, takie jak klasa (.active_record) lub rodzaju stowarzyszenia (.macro). Przed szynami 4.2 klucze tego skrótu są symbolami, a nie ciągami.

+0

ten pracował dla mnie ... Issue.reflections [: assigned_to] .options [: foreign_key] .. Dzięki –

1

Prawidłowy sposób Rails 4.2:

Issue.reflections['assigned_to'].options[:foreign_key] 

Zauważ, że „assigned_to” to ciąg według API:

Zwraca skrót nazwy refleksji jako klucz i AssociationReflection jako wartość.

http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-reflections

+1

Uwaga: Spowoduje to powrót tylko na zlecenie zagranicznych klucze dołączone do opcji Hash przeszły do pomocnika stowarzyszenia. Więc nie będzie działać w standardowych przypadkach, w których klucz obcy jest ustawiany automatycznie. BTW Frederick's Solution nadal działa w Rails 4.2 – MhdSyrwan

+1

Rzeczywiście! Dziękuję za uwagę! Jednak, aby rozwiązanie Fryderyka działało w Railsach 4.2, nazwa asocjacji musi być przekazywana jako ciąg zamiast symbolu. –

Powiązane problemy