Rails own_to не устанавливает идентификатор внешнего ключа с именем пользовательского класса - PullRequest
8 голосов
/ 09 июля 2011

У меня настроены мои модели так:

class User < ActiveRecord::Base
  has_many :posts, :foreign_key => 'author_id'
end

class Post < ActiveRecord::Base
  belongs_to :author, :class_name => 'User'
end

Предполагая, что:

p = Post.first # just any post instance
a = User.first # any user instance

Теперь этот кусок кода действует очень странно

p.author = a

После установки автора атрибут author_id сообщения должен быть установлен на идентификатор пользователя. Но этого не происходит.

Я пытался использовать модели с belongs_to, у которых нет параметра class_name, и все работает как положено.

Теперь, еще одна вещь, которая делает его более странным, это то, что когда я изменяю ассоциацию на belongs_to :author, :class_name => 'User', :foreign_key => 'author_id', она удивительно работает.

Это ошибка в Rails 3.0.9? Не должен ли параметр внешнего ключа быть ненужным, потому что, как говорят документы, его значением по умолчанию является имя ассоциации, добавленное с _id.

Также обратите внимание, что даже без :foreign_key => 'author_id' все остальное, что касается ассоциации, работает должным образом. (Подобно извлечению связанной модели) Единственное, что не работает, это метод установки, не устанавливающий внешний ключ.

Я знаю, что мог бы просто сделать p.author_id = a.id или просто добавить :foreign_key params для всех моих ассоциаций с class_name, но я предпочитаю более элегантный синтаксис p.author = a

1 Ответ

6 голосов
/ 09 июля 2011

После прочтения большого количества кода Rails и трассировки вот что я нашел:

Эта ошибка существует из-за гема composite_primary_keys, который перекрывает рельсы по умолчанию reflection.rb.

Я будуЯ должен проверить, как они реализовали методы primary_key_name и derive_primary_key_name.

Это глупая ошибка была потрачена много времени, но, по крайней мере, я многое узнал о внутренностях ActiveRecord.

...