使用Active Record Query Model'select'和'where'的数组结果

时间:2011-10-27 08:45:37

标签: ruby-on-rails

我有一个用户,成员资格和群组模型。用户拥有许多成员资格,并通过成员资格进行分组。一个组拥有许多成员资格,用户通过成员资格。会员资格属于两者。

当用户访问用户索引视图时,我想向他/她显示属于他/她所属组的所有用户:我创建了以下代码,但这不起作用。我似乎无法让查询工作。皮斯帮忙!

用户控制器中的代码

class UsersController < ApplicationController

  def index
      @users = current_user.relevant_members
  end

end

用户模型中的代码

def relevant_members
  group_ids = self.group_ids
  user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")
  User.find(user_ids)
end

我不明白为什么,在控制台中测试时,user_ids不是一个id数组,而是以下数组:

[#<Membership user_id: 2>, #<Membership user_id: 2>, #<Membership user_id: 3>, #<Membership user_id: 3>, #<Membership user_id: 3>, #<Membership user_id: 2>]

返回一组用户ID以查找所有相关组成员的更好方法是什么?

5 个答案:

答案 0 :(得分:3)

Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")

总是返回一个Membership对象数组,select(“user_id”)只更改从DB加载到对象的字段。

将它映射到id

就足够了
user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})").map(&:user_id)

答案 1 :(得分:1)

Membership.select('user_id')将返回仅包含Membership属性的user_id个对象数组,到目前为止这是正确的。如果从结果中提取id,它将起作用:

membershipts = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")
user_ids = memberships.map(&:user_id)

祝你好运

托拜厄斯

答案 2 :(得分:1)

您是否尝试过pluck()函数? https://apidock.com/rails/ActiveRecord/Calculations/pluck

user_ids = Membership.pluck("user_id").where("group_id IN (#{group_ids.join(", ")})")

答案 3 :(得分:0)

这是因为您的user_ids是类Membership的对象,因此您无法直接获取'user_ids'的数组

您必须执行以下操作

  user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")
  user_ids_array = user_ids.collect{|u| u.user_id}
  User.find(user_ids_array)

此外,您可以修改您的where子句,如下所示,这是更多的ruby方式。

user_ids = Membership.select("user_id").where(["group_id IN (?)", group_ids])

答案 4 :(得分:0)

Membership.where("group_id in (#{groups.collect(&:id).join(',')})")
    .all.collect(&:user_id)