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 上的两个作用域有很多通过返回比一个单一作用域更大的计数的主要内容,如果未能解决你的问题,请参考以下文章