Rails 上的两个作用域有很多通过返回比一个单一作用域更大的计数

Posted

技术标签:

【中文标题】Rails 上的两个作用域有很多通过返回比一个单一作用域更大的计数【英文标题】:Rails two scopes on has many through returns a bigger count than one single scope 【发布时间】:2021-11-17 14:46:42 【问题描述】:

有一个具有以下关联和范围的 Customer 类:

 has_many :hangouts
 has_many :bookings, through: :hangouts
 scope :already_finished, ->  joins(:bookings).where("bookings.time < ?", DateTime.now) 
 scope :who_booked_trips, ->  where(won_deal: true) 

当我跑步时

Customer.who_booked_trips.count 

我得到了 653 的号码

当我跑步时

Customer.already_finished.count 

我得到了 662 的号码

当我跑步时

Customer.who_booked_trips.already_finished.count

我得到了 661 的号码!

who_booked_trips.already_finished.count 不应该小于 who_booked_trips.count 吗?

我在这里错过了什么?

谢谢

【问题讨论】:

【参考方案1】:

使用joins 将导致重复的客户被退回。举一个简单的例子,你有 1 位客户有 2 次预订:

> Customer.count
=> 1
> Customer.joins(:bookings).count
=> 2
> Customer.joins(:bookings).distinct.count
=> 1

如果您只想返回唯一客户,请在作用域上调用distinct 方法:

 scope :already_finished, ->  joins(:bookings).where("bookings.time < ?", DateTime.now).distinct 

【讨论】:

【参考方案2】:

追加.uniq

scope :already_finished, ->  joins(:bookings).where("bookings.time < ?", DateTime.now).uniq 

这应该返回所有 uniq 记录。

【讨论】:

接受了另一个答案,因为“Rails 5.1 已从 Activerecord Relation 中删除了 uniq 方法并添加了 distinct 方法”

以上是关于Rails 上的两个作用域有很多通过返回比一个单一作用域更大的计数的主要内容,如果未能解决你的问题,请参考以下文章

在Spring中,Bean有几种作用域

函数的作用域和类的作用域有啥区别

spring配置文件中能够用到的bean的作用域有哪些

spring的bean作用域有几种,开发中需要注意啥?

PayPal IPN HTML 表单的 src 和 sra 表单域有啥作用?

PayPal IPN HTML 表单的 src 和 sra 表单域有啥作用?