Ruby on rails Rails 5:视图中的不同值
我有一个工作解决方案,可以找到属于当前用户公司的用户 在/controllers/users\u controller.rb中,我有: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用户
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