Rails 3.1 has_many:: through => не работает (объединенная модель возвращает nil) - PullRequest
2 голосов
/ 19 октября 2011

Обновление : Это все из-за глупой ошибки: ранее я определил метод с тем же именем, что и у одного из методов, создаваемых ActiveRecord, который маскировал правильное поведение и нарушал все.Я не могу ответить / закрыть вопрос еще несколько часов, извиняюсь перед любым, кто заглянул в это!

В моем приложении на Rails 3.1 возникла проблема с отношением has_many, :through =>.

Это приводит в бешенство, потому что, насколько я вижу, оно идентично двум подобным отношениям, которые оба работают.

Владелец этих отношений объявляет их следующим образом:

has_many :user_skills, :dependent => :destroy
has_many :skills, :through => :user_skills
has_many :user_roles, :dependent => :destroy
has_many :roles, :through => :user_roles
has_many :conversation_users
has_many :conversations, :through => :conversation_users

(я знаю, что я не соблюдаю стандартную номенклатуру для таблиц соединения - я только читаю о соглашении обоих-множественного числа, имена-алфавитные после настройки, и я буду рефакторинг позже)

Первые две пары отношений (навыки и роли) работают очень хорошо.

Окончательные отношения (разговоры) неработать полностью.user.conversation_users возвращает ожидаемый массив, но user.conversations возвращает nil.Не пустой массив, nil.

Я вполне могу сделать что-то глупое здесь, поэтому я был бы очень признателен всем, кто может заметить что-то не так с ConversationUser или Conversation моделями ниже.

разговор_пользователь.рб

class ConversationUser < ActiveRecord::Base
  belongs_to :user, :inverse_of => :conversation_users
  belongs_to :conversation, :inverse_of => :conversation_users

  validates_presence_of :user
  validates_presence_of :conversation
end

разговор.рб

class Conversation < ActiveRecord::Base
  has_many :messages, :dependent => :destroy
  has_many :conversation_users, :dependent => :destroy
  has_many :users, :through => :conversation_users

  validates_presence_of :unique_id
end

(я также знаю, что это недействительно достаточно сложный, чтобы оправдать has_many, :through => над has_and_belongs_to_many, но запланированные дополнительные функции потребуют моделей объединения.)

1 Ответ

2 голосов
/ 21 октября 2011

Ответ на закрытый вопрос :

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

...