2016-02-01 2 views
0

У меня есть две таблицы пользователя и группы.Получить данные из ассоциации

user  group 
----- ------- 
id  id 
name  group_name 
      created_by 

В моей модели пользователя я использовал, has_and_belongs_to_many :groups, dependent: :destroy

В моей группе модели я использовал, has_and_belongs_to_many :users, dependent: :destroy

У меня есть создать миграцию

class UserGameGroup < ActiveRecord::Migration 
    def change 
    create_table :user_game_group, id: false do |t| 
     t.belongs_to :user, index: true 
     t.belongs_to :group, index: true 
    end 
    end 
end 

Таким образом, в моей группе контроллер `s show method, я хочу получить пользователей для определенной группы. Предположим, что если я нахожусь в группе 4, я хочу получить всех пользователей на основе этой группы.

Я могу это сделать Group.where(group_id: 4), но он даст мне только идентификатор пользователя. Есть ли способ получить имя пользователя тоже?

ответ

2

Предположим, если я в настоящее время на 4-й группы, я хочу, чтобы извлечь все пользователи на основе этой группы

@group = Group.find 4 
@group.users.each do |user| #-> collection of User objects for @group 
    user.name 
end 

Неправильное имя таблицы соединений.

Для has_and_belongs_to_many, он должен быть [alphabetical_first_plural]_[alphabetical_second_plural], в вашем случае groups_users:

class UserGameGroup < ActiveRecord::Migration 
    def change 
    create_table :groups_users, id: false do |t| 
     t.belongs_to :user, index: true 
     t.belongs_to :group, index: true 
    end 
    end 
end 

Если вы хотите использовать имя таблицы, у вас есть, вы должны явно определить параметр join_table в модели:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups, join_table: :user_game_groups 
end 

#app/models/group.rb 
class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users, join_table: :user_game_groups 
end 

Чтобы заполнить таблицу присоединиться, вы можете использовать << & .delete methods:

@user = User.find x 
@group = Group.find y 

@user.groups << @group 
@user.groups.delete @group 
+0

таблица user_game_groups пуста, поэтому, когда я использовал ваш код, я получил пустой массив, однако у меня есть данные как у моего пользователя, так и для групповой таблицы. почему я получаю пустой ответ? Поэтому я проверил свой db, и я не могу добавить что-либо в таблицу user_game_groups –

+0

. Я добавлю обновление –

1

В вашем текущем примере вы запрашиваете одну группу, которая будет иметь метод users. Точно так же вы можете использовать этот вызов для извлечения коллекции пользовательских записей.

group = Group.where(group_id: 4) 
group.users # Returns a collection of users. 

Если вы хотите, чтобы сделать один запрос, вы можете использовать ActiveRecord::QueryMethodsinclude метод, как так.

Group.includes(:user).where(group_id: 4) 
1

Вы должны переименовать свою объединенную группу в groups_users. Rails ожидают, что объединенная группа будет в этом формате (меньший алфавит из таблиц объединения сначала и таблица, разделенная на _). плюс оба должны быть множественными. Также как ваша группа имен таблиц, так и пользователь должны быть множественными, такими как groups и users, иначе вам нужно указать имя таблицы вручную на модели.

Кроме того, для того, чтобы принести имя и другие атрибуты для пользователя, вы можете сделать что-то вроде

group = Group.find(4)  
group_users = group.users 

group_users даст вам список всех пользователей, которые принадлежат к группе с идентификатором 4.

Смежные вопросы