在我的方法中,我想检查用户是否只有一个股东,是否应该返回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
答案 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')
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 ....
答案 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关联