【问题标题】:Rails scope with multiple joins and record finding具有多个连接和记录查找的 Rails 范围
【发布时间】:2013-11-02 14:25:58
【问题描述】:

我有 Client、Deal 和 DealType 模型。 客户有很多交易。交易属于 DealType。 DealType 有属性——关闭。 我需要选择所有尚未完成交易的客户。

scope :active, -> { where('deals.last.deal_type.closing = ?', false) } 之类的东西(当然是不正确的)。

如何在 Rails 4 中以最佳方式做到这一点?

ps。将不胜感激源链接,以了解使用 rails 的 sql 查询。

【问题讨论】:

    标签: sql ruby-on-rails scope ruby-on-rails-4


    【解决方案1】:

    试试

    joins(deals: :deal_type).where('deal_types.closing = ?', false)
    

    很好的阅读:

    ActiveRecord Query Interface

    特别是:

    Joining Tables

    【讨论】:

    • 谢谢。这几乎是我想要的,但我只需要检查客户的最后一次(按 ID 或日期)交易:)
    • 啊,你的要求跟我差不多。我是通过使用 SQL 做到的,还没有找到 ActiveRecord 的方法来做到这一点。这是我的问题:stackoverflow.com/questions/19709552/…
    • 添加到@jcm。我找不到完整的活动记录解决方案。但我们可以这样做:scope: :active, -> {joins(deals: :deal_type).joins("INNER JOIN (SELECT deals.client_id, MAX(deals.created_at) AS latest_deals_date FROM deals GROUP BY deals.client_id) latest_deals ON (deals.client_id=latest_deals.client_id AND deals.created_at>=latest_deals.latest_deals_date)").where('deal_types.closing = ?', false)}
    • @Abhinaya 是的,看起来内部查询确实需要在 SQL 中完成。
    【解决方案2】:

    如果您不介意在原始 SQL 中执行此操作,请尝试:

    SELECT clients.*,deals.* FROM clients INNER JOIN deals ON clients.id=deals.client_id
    INNER JOIN
    (
     SELECT deals.client_id, MAX(deals.created_at) AS latest_deals_date
     FROM deals
     GROUP BY deals.client_id
    ) latest_deals
    ON (deals.client_id=latest_deals.client_id AND deals.created_at>=latest_deals.latest_deals_date)
    INNER JOIN deal_types ON deals.deal_type_id=deal_types.id
    WHERE deal_types.closing=false;
    

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多