ruby-on-rails – ActiveRecord Association选择包含记录的计数

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – ActiveRecord Association选择包含记录的计数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
class User  
  has_many :tickets 
end

我想创建一个包含用户计数凭证逻辑的关联,并在include(user 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个查询以收集包含的用户

UPDATE2

我知道sql我知道如何用联接选择这个,但我的问题现在就像“如何获取数据”.我的问题是关于建筑协会,我可以使用包括.谢谢

UPDATE3
我尝试创建关联,如用户has_one ticket_count,但是

>看起来像has_one不支持关联扩展
> has_one不支持:group选项
> has_one不支持finder_sql

解决方法

尝试这个:
class User

  has_one :tickets_count,: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选项.

您可以通过使用范围/类方法的组合轻松实现所需

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

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

原文链接:https://www.f2er.com/ruby/272303.html

猜你在找的Ruby相关文章