用Rails高效的方式仅需一名股东即可找到用户

时间:2019-04-25 06:28:30

标签: ruby-on-rails ruby-on-rails-5

在我的方法中,我想检查用户是否只有一个股东,是否应该返回true(后来在if块中使用它)。基本上,它应该反映类似User.find_by(id: user.id).shareholder.count < 1之类的东西,因为它会因不必要的查询而使数据库过载(我的数据库拥有约3万名用户)。

我当时想的是使用where创建查询,所以我有了这个:

def one_shareholder?(shareholder)
  ShareholdersUser.where(user_id: shareholder.owner_id).
                   where.not(shareholder_id: shareholder.id).exists?
end

但是我不知道如何实现查询,如果该用户只有一个股东,该查询就很重要。我应该使用类似find_each的东西吗?

编辑:

user has_many :shareholder

shareholder belongs_to :owner

ShareholdersUser belongs_to :user and :shareholder

2 个答案:

答案 0 :(得分:1)

也许这可以给您提示。我在具有以下模型的项目中使用了类似的东西:

class Company < ApplicationRecord
  has_many :permits
end

class Permit < ApplicationRecord
  belongs_to :company
end

对于仅使用一张许可证的取货公司:

Company.joins(:permits).group('companies.id').having('count(company_id) = 1')


也许您可以提取ID并使用数组检查公司是否在数组中。例如:

ids_of_companies_having_one_permit = Company.joins(:permits).group('companies.id').having('count(company_id) = 1').pluck(:id)

然后检查:

if ids_of_companies_having_one_permit.include? company.id ....


这是我关注的线程:Find all records which have a count of an association greater than zero

答案 1 :(得分:0)

首先,如果您从其ID中找到用户,则可以直接使用User.find(user.id)而不是User.find_by(id: user.id)

第二,正如您在问题中提到的,您希望条件为true / false。

根据您的查询,我认为您已经实现了user has_many shareholder关联。

因此,您可以在如下所示的if条件下直接使用User.find(user.id).shareholders < 1

if User.find(user.id).shareholders.count < 1
     #do something...
end

注意:我使用股东的复数作为条件,因为我们有has_many关联