gpt4 book ai didi

ruby-on-rails - ActiveRecord 关联选择包含记录的计数

转载 作者:数据小太阳 更新时间:2023-10-29 06:37:31 26 4
gpt4 key购买 nike

例子

class User  
has_many :tickets
end

我想创建关联,其中包含用户计数票的逻辑,并在包含(用户 has_one ticket_count)中使用它

Users.includes(:tickets_count)

我试过了

  has_one :tickets_count, :select => "COUNT(*) as tickets_count,tickets.user_id " ,:class_name => 'Ticket', :group => "tickets.user_id", :readonly => true  

User.includes(:tickets_count)

ArgumentError: Unknown key: group

在这种情况下,include 中的关联查询应该使用 count 和 group by ...我如何使用 Rails 实现它?

更新

  • 我无法更改表结构
  • 我希望 AR 为包含的用户集合生成 1 个查询

更新2

我知道 SQL,我知道如何通过连接选择它,但我现在的问题是“如何获取数据”。我的问题是关于建立关联,我可以在 include 中使用它。谢谢

更新3我尝试创建像用户 has_one ticket_count 一样创建的关联,但是

  1. 看起来 has_one 不支持关联扩展
  2. has_one 不支持:group 选项
  3. has_one 不支持 finder_sql

最佳答案

试试这个:

class User

has_one :tickets_count, :class_name => 'Ticket',
:select => "user_id, tickets_count",
:finder_sql => '
SELECT b.user_id, COUNT(*) tickets_count
FROM tickets b
WHERE b.user_id = #{id}
GROUP BY b.user_id
'
end

编辑:

看起来 has_one 关联不支持 finder_sql 选项。

您可以通过组合使用 scope/class 方法轻松实现您想要的

class User < ActiveRecord::Base

def self.include_ticket_counts
joins(
%{
LEFT OUTER JOIN (
SELECT b.user_id, COUNT(*) tickets_count
FROM tickets b
GROUP BY b.user_id
) a ON a.user_id = users.id
}
).select("users.*, COALESCE(a.tickets_count, 0) AS tickets_count")
end
end

现在

User.include_ticket_counts.where(:id => [1,2,3]).each do |user|
p user.tickets_count
end

如果 tickets 表中有数百万行,则此解决方案会对性能产生影响。您应该考虑通过向内部查询提供 WHERE 来过滤 JOIN 结果集。

关于ruby-on-rails - ActiveRecord 关联选择包含记录的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9209154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com