2012-03-23 4 views
18

Ничего себе я боролся с этим в течение целого дня, следуя «официальному» рубину на справочнике направляющих, и только что обнаружил, что я мог ошибаться в документе все время. Я просто хочу подтвердить, верно ли это.Ruby on Rails неверный справочный документ по ассоциации Activerecord?

Если вы идете к http://guides.rubyonrails.org/association_basics.html и под 2.10. самостоятельно присоединяется к секции он говорит:

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

Теперь, я новичок, и просто верили в этом коде (Что еще я могу сделать?) и написал код, что это изменение этого я присоединиться к делу. Однако чем больше я смотрел на него, тем больше он не чувствовал себя хорошо. не :subordinates Предполагается, что поле :foreign_key вместо :manager? Во всяком случае, я только что изменил его так, чтобы код был примерно таким:

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

и теперь он работает. Я что-то упускаю? Или официальный документ ошибочен? Трудно поверить, что в официальном документе будет представлена ​​некорректная информация, но, возможно, так оно и есть.

+2

Да, вы правы. Конечно, ассоциация с именем 'manager' корректно примет внешний ключ' manager_id'. И тогда ассоциация 'subordinates' будет таким же образом принимать недопустимый foreign_key' subordinate_id', так что это тот, который нуждается в изменении. – DanneManne

+6

Я отправляю фиксацию для docrails, которая исправляет эту ошибку – MikDiet

+0

Я вижу, как: foreign_key => 'manager_id' был правильно помещен. Насколько я знаю, foreign_key идет с ссылкой на сторону отношения. Мне хотелось бы увидеть пример из того, что вы называете «... и теперь он работает». Конечно, я мог что-то упустить. – Daniel

ответ

1

Это верно, the guide document неверно на момент написания этой книги.

belongs_to не нужен параметр :foreign_key, так как AR будет вызывать manager_id от имени ассоциации («менеджер»). Как описано в документе, AR будет вызывать ошибку, если, учитывая Employee @dwight, одна попытка будет @dwight.subordinates, поскольку AR будет использовать employee_id в условии WHERE оператора SELECT.

Согласно AR documentation передачи опции :foreign_keyhas_many к результатам в объявлении FK, который будет использоваться при создании запроса для @dwight.subordinates.

Смежные вопросы