我有两个表用户和组。
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。有没有办法获取用户名?
答案 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希望加入组采用这种格式(首先是连接表的较小字母表,而_
分隔的表名为)。加上两者应该是复数。您的表名组和用户也应该是复数,例如groups
和users
,否则您必须在模型上手动指定表名。
此外,为了获取用户的名称和其他属性,您可以执行类似
的操作 group = Group.find(4)
group_users = group.users
group_users
会为您提供属于ID为4的组的所有用户的列表。