首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在joined表上写条件?

问如何在joined表上写条件?
EN

Stack Overflow用户
提问于 2020-04-13 13:47:46
回答 2查看 61关注 0票数 1

票证和账号两种模式。账号有很多票。我正在尝试为每个帐户获取最后创建的票证。

代码语言:javascript
复制
accounts = Account.where(:deleted => false).pluck(:id)    
tickets = Ticket.left_outer_joins(:account)
    .where(:account_id => accounts)
    .order(created_at: :desc)

  ticket_ids = Array.new
  accounts.each do |account|
    ticket = tickets.where(:account_id => account).order(created_at: :desc).limit(1).first
    if !ticket.blank?
      ticket_ids.push(ticket.id)
    end
  end

  @tickets = tickets.where(:id => ticket_ids).order(created_at: :desc)

上面的代码可以工作,并且@tickets包含预期的输出。但问题是上面的代码花费了太多的时间。有没有办法在抓取查询本身中完成所有这些操作?或者,有什么方法可以优化它吗?

我使用的数据库: Mysql

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-13 14:50:53

我会尝试用子查询来解决这个问题。

代码语言:javascript
复制
ticket_ids = Ticket
  .select('MAX(tickets.id)')
  .joins(:account)
  .where(accounts: { deleted: false })
  .group(account_id)

@tickets = Tickets
  .where(id: ticket_ids).order(created_at: :desc)
票数 0
EN

Stack Overflow用户

发布于 2020-04-13 14:21:52

代码语言:javascript
复制
ticket_ids = Ticket.order(created_at: :desc).group_by(&:account_id).values
@tickets = Ticket.where(id: ticket_ids)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61182194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档