Rails — сомнение в модели

#ruby-on-rails #ruby-on-rails-3 #models #rails-models

#ruby-on-rails #ruby-on-rails-3 #Модели #rails-модели

Вопрос:

Учитывая тот факт, что у меня есть модели, подобные этой:

 class Person
  has_many :owned_groups, :class_name => "Group", :foreign_key => :owner_id
  has_many :owned_group_memberships, :through => :owned_groups, 
              :source => :group_memberships 

  has_many :group_memberships, :foreign_key => "member_id"
  has_many :groups, :through => :group_memberships

end

class GroupMembership
  belongs_to :member, :class_name => 'Person'
  belongs_to :group
end

class Group
  belongs_to :owner, :class_name => "Person"
  has_many :group_memberships
  has_many :members, :through => :group_memberships
end
  

Как я могу получить доступ к members a group has? Всегда, когда я делаю @group.members или что-то подобное, выдает мне ошибку, в которой говорится, что связь не может быть найдена в модели.

Заранее спасибо.

##РЕДАКТИРОВАТЬ##

Ошибка, которую я получаю, это: Could not find the association "group_memberships" in model Group

Комментарии:

1. Вы пробовали @group.people?

2. Пожалуйста, покажите нам ошибку, которую вы получаете.

3. Я показал ошибку, но на этот раз я скопирую ее: Could not find the association "group_memberships" in model Group

4. можем ли мы увидеть вашу миграцию? На всякий случай

Ответ №1:

Я делаю похожую вещь на сайте, над которым я работаю, но ассоциации немного отличаются от того, как вы это делаете, но, возможно, это поможет. Я думаю, вам нужно использовать ассоциацию has_and_belongs_to_many, чтобы объединить ваши «многие ко многим».

В моей базе данных у меня есть пользователи, участники и UsersMembers

Вам не нужно создавать модель UsersMembers (в вашем случае GroupMembership), но вам нужна таблица базы данных, чтобы связать их.

 #Migration
    create_table :bands_users, :id => false, :force => true do |t|
      t.integer :band_id,       :null => false
      t.integer :user_id,       :null => false
    end

#Models
  class Band < ActiveRecord::Base
    has_and_belongs_to_many :members, :class_name => 'User'
  end

  class User < ActiveRecord::Base
    has_and_belongs_to_many :bands
  end
  

Из этого я теперь могу вызвать @band.members или @user.bands

Комментарии:

1. Спасибо за ответ! Проблема в том, что у меня есть атрибуты в Group_Membership и весь мой проект уже работает с этой структурой. Таким образом, подобные изменения были бы недоступны =/

Ответ №2:

Возможно, вам потребуется указать:class_name => ‘Person’ в вашем операторе has_many :members.