#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.