从关联中获取数据

时间:2016-02-01 11:54:10

标签: ruby-on-rails associations

我有两个表用户和组。

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

因此,在我的组控制器的show方法中,我想获取特定组的用户。 假设我目前在第4组,我想根据该组获取所有用户。

我可以执行此操作Group.where(group_id: 4)但它只会给我用户的ID。有没有办法获取用户名?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在您当前的示例中,您要查询单个组,其中包含方法users。同样,您可以使用此调用来检索用户记录集合。

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

如果您想制作单个查询,可以使用ActiveRecord::QueryMethods include方法。

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

答案 2 :(得分:1)

您应该将加入群组重命名为groups_users。 Rails希望加入组采用这种格式(首先是连接表的较小字母表,而_分隔的表名为)。加上两者应该是复数。您的表名组和用户也应该是复数,例如groupsusers,否则您必须在模型上手动指定表名。

此外,为了获取用户的名称和其他属性,您可以执行类似

的操作
 group = Group.find(4)    
 group_users = group.users

group_users会为您提供属于ID为4的组的所有用户的列表。