2012-03-23 8 views
18

Wow, zmagałem się z tym przez cały dzień, podążając za dokumentem "oficjalny" rubinowy przewodnik po szynach i odkryłem, że przez cały czas mogłem się pomylić z dokumentem. Chcę tylko potwierdzić, czy to prawda.Dokument przewodników Ruby on Rails jest nieprawidłowy w skojarzeniu z Activerecord?

Jeśli przejdziesz do http://guides.rubyonrails.org/association_basics.html i poniżej 2.10. jaźń łączy punkt mówi:

class Employee < ActiveRecord::Base 
    has_many :subordinates, :class_name => "Employee" 
    belongs_to :manager, :class_name => "Employee", 
    :foreign_key => "manager_id" 
end 

Teraz jestem nowicjuszem i po prostu wierzył w tym kodzie (Co jeszcze mogę zrobić?) i napisał jakiś kod, który jest odmianą tej jaźni dołączyć sprawę. Jednak im więcej na to patrzyłem, tym bardziej nie czułem się dobrze. nie jest :subordinates przypuszczalnie mieć pole :foreign_key zamiast :manager? W każdym razie właśnie zmieniłem to tak, że kod jest podobny:

class Employee < ActiveRecord::Base 
    has_many :subordinates, :class_name => "Employee", :foreign_key => "manager_id" 
    belongs_to :manager, :class_name => "Employee" 
end 

i teraz działa. Czy czegoś brakuje? Czy też oficjalny dokument jest nieprawidłowy? Trudno uwierzyć, że oficjalny dokument przedstawiłby nieprawidłowe informacje, ale może tak właśnie jest.

+2

Tak, masz rację. Stowarzyszenie o nazwie 'manager' oczywiście oczywiście poprawnie zajął klucz obcy' manager_id'. I wtedy skojarzenie "podwładnych" w ten sam sposób zakłada niepoprawny foreign_key 'identyfikator_węzła_ległego', więc to on musi się zmienić. – DanneManne

+6

Wysyłam commit do docrails, który naprawia ten błąd – MikDiet

+0

Widzę, w jaki sposób: foreign_key => 'manager_id' został poprawnie umieszczony. Jak daleko wiem, foreign_key idzie z stroną belongs_to relacji. Chciałbym zobaczyć przykład tego, co nazywacie "... a teraz działa". Oczywiście, może mi brakować czegoś. – Daniel

Odpowiedz

1

To prawda, the guide document jest niepoprawny w momencie pisania tego tekstu.

Opcja belongs_to nie wymaga opcji :foreign_key, ponieważ AR wyprowadza manager_id z nazwy powiązania ("menedżer"). Jak udokumentowano, AR podniosłoby błąd, gdy, biorąc pod uwagę pracownika @dwight, próbowano uzyskać @dwight.subordinates, ponieważ AR użyłby employee_id w warunku WHERE instrukcji SELECT.

Według AR documentation przekazując opcję :foreign_key do has_many wyników w deklarowania FK, które będą wykorzystywane podczas generowania zapytania do @dwight.subordinates.

Powiązane problemy