例
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结果集.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。