Ruby on rails Rails 5:视图中的不同值

Ruby on rails Rails 5:视图中的不同值,ruby-on-rails,ruby,view,distinct,Ruby On Rails,Ruby,View,Distinct,我有一个工作解决方案,可以找到属于当前用户公司的用户 在/controllers/users\u controller.rb中,我有: def index @companies = current_user.companies.includes(:users) @users = @companies.map(&:users).flatten end 在控制台中,我可以得到以下信息(当前用户ID=2): 用户:1,2是我想要的结果 /models/user.rb class用户

我有一个工作解决方案,可以找到属于当前用户公司的用户

在/controllers/users\u controller.rb中,我有:

def index
@companies = current_user.companies.includes(:users)
@users = @companies.map(&:users).flatten
end
在控制台中,我可以得到以下信息(当前用户ID=2):

用户:1,2是我想要的结果

/models/user.rb

class用户
/models/account.rb

类帐户
/models/company.rb

class公司
目前,我看到的是:
与此相关的部分:

<li>
   <%= link_to user.name, user %>
</li>

  • 如何获得用户的唯一值?目前,如果一个用户在多个公司,我会获得多个用户值。

    @users=@companys.map(&:users).flatten.uniq
    我认为应该这样做

    同样基于@idej的答案,你也可以这样做

    @users = User.joins(:accounts).where("accounts.company_id IN (?)", current_user.companies.pluck(:id)).uniq 
    

    我相信,哪个应该做同样的事情并且更高效

    @users=@companys.map(&:users.plant.uniq
    应该做

    同样基于@idej的答案,你也可以这样做

    @users = User.joins(:accounts).where("accounts.company_id IN (?)", current_user.companies.pluck(:id)).uniq 
    

    哪个应该做同样的事情并且更有效

    您可以使用
    uniq
    方法从数组中删除重复项

    @companies = current_user.companies
    @users = @companies.map(&:users).flatten.uniq
    
    或者,您也可以使用活动记录创建查询,如

    @companies = current_user.companies
    @users = User.joins(:accounts).where("accounts.company_id in (?)", @companies.map(&:id)).uniq
    

    您可以使用
    uniq
    方法从数组中删除重复项

    @companies = current_user.companies
    @users = @companies.map(&:users).flatten.uniq
    
    或者,您也可以使用活动记录创建查询,如

    @companies = current_user.companies
    @users = User.joins(:accounts).where("accounts.company_id in (?)", @companies.map(&:id)).uniq
    

    谢谢你的第一个建议,但是我得到了这个错误:
    nil的未定义方法映射:NilClass你是说?点击
    第二次我得到这个
    QLite3::SQLException:没有这样的列:users.company\u id:从“users”中选择不同的“users”。*其中的“users”。(14、15、16)
    中的“company\u id”在Accounts表中有两列:company\u id,用户ID在第一个解决方案中,您应该像初始化
    @companys
    一样初始化
    @companys=current\u user.companys.includes(:users)
    ,然后初始化
    @users=@companys.map(&:users).flatten.uniq
    。第二种方法不起作用,因为我错过了您通过accounts表建立关系的机会。谢谢,您编辑的建议很有效,尽管在我看来,它比@Rocco solution的效果要差一点。无论如何,Rails社区是最好的,谢谢你+我也对你的答案投了赞成票。你用uniq进行的查询效率很低,而且需要进行大量的n+1查询。您应该删除它,或者提供一个没有查询的更好的解决方案,例如@users=User.where(company\u id:@companys.pulk(:company\u id))谢谢您,但是对于第一个建议,我得到了以下错误:
    未定义nil:NilClass的方法映射您的意思是什么?点击
    第二次我得到这个
    QLite3::SQLException:没有这样的列:users.company\u id:从“users”中选择不同的“users”。*其中的“users”。(14、15、16)
    中的“company\u id”在Accounts表中有两列:company\u id,用户ID在第一个解决方案中,您应该像初始化
    @companys
    一样初始化
    @companys=current\u user.companys.includes(:users)
    ,然后初始化
    @users=@companys.map(&:users).flatten.uniq
    。第二种方法不起作用,因为我错过了您通过accounts表建立关系的机会。谢谢,您编辑的建议很有效,尽管在我看来,它比@Rocco solution的效果要差一点。无论如何,Rails社区是最好的,谢谢你+我也对你的答案投了赞成票。你用uniq进行的查询效率很低,而且需要进行大量的n+1查询。您应该删除它,或者提供一个没有查询的更好的解决方案,例如@users=User.where(company\u id:@companys.pulk(:company\u id))谢谢,但是这不起作用,因为我遇到了以下错误:
    未定义nil:NilClass的方法映射。您的意思是?在控制台示例的当前解决方案中点击
    ,我看到了这两个用户ID,但无法打印出来。这意味着
    @companys
    变量未初始化。如果您不需要它,您可以不使用它
    当前用户.公司.包括(:用户).map(&:users).flatten.uniq
    谢谢,您编辑的第二条建议很有魅力,似乎是最有效的:)谢谢,但是这不起作用,因为我得到了以下错误:
    未定义的nil:NilClass方法映射你是什么意思?在控制台示例的当前解决方案中点击
    ,我看到了这两个用户ID,但无法打印出来。这意味着
    @companys
    变量未初始化。如果您不需要它,您可以不用它
    当前用户.公司.包括(:用户).map(&:users).flatten.uniq
    谢谢,您编辑的第二条建议很有魅力,似乎是最有效的:)
    @companies = current_user.companies
    @users = User.joins(:accounts).where("accounts.company_id in (?)", @companies.map(&:id)).uniq