Ruby on Rails направляет документ об ассоциации Activerecord неверно? - PullRequest
18 голосов
/ 23 марта 2012

Ничего себе, я боролся с этим целый день, следуя «официальному» документу ruby ​​on rails guides, и только что обнаружил, что я все время ошибался этим документом. Я просто хочу подтвердить, правда ли это.

Если вы перейдете на 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

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

1 Ответ

1 голос
/ 01 апреля 2012

Правильно, документ руководства неверен на момент написания этой статьи.

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

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

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