How to do joins on subqueries in AREL within Rails

前端 未结 2 1031
别那么骄傲
别那么骄傲 2021-02-14 16:29

I have a simple model

class User
    has_many :logs


class Logs

related in the usual way through the foreign key logs.user_id. I\'m trying to

相关标签:
2条回答
  • 2021-02-14 17:11

    You can use join_sources to retrieve the Arel::Nodes::Join from the instance of Arel::SelectManager, and pass that to joins

    Using your example:

    l_t.joins(counts.join_sources).on(l_t[:id].eq(counts[:user_id]))
    
    0 讨论(0)
  • 2021-02-14 17:12

    This achieves a join of nested select subquery with Arel:

    You can add the nested inner_query and an outer_query scope in your Model file and use ...

      inner_query = Model.inner_query(params)
      result = Model.outer_query(params).joins(Arel.sql("(#{inner_query.to_sql})"))
       .group("...")
       .order("...")
    

    For variations on this, for example to use INNER JOIN on the subquery, do the following:

      inner_query = Model.inner_query(params)
      result = Model.outer_query(params).joins(Arel.sql("INNER JOIN (#{inner_query.to_sql}) tablealias ON a.id = b.id"))
       .group("...")
       .order("...")
    

    Add in the specific joins, constraints and groupings to each of the queries' scopes to modify the sql statement further ie:

    scope :inner_query , -> (company_id, name) {
        select("...")
        .joins("left join table1 on table1.id = table2.id")
        .where("table1.company_id = ? and table1.name in (?)", company_id, name)
        .group("...")
    }
    

    This allows you to put WHERE conditions on the nested query as well as the outer query

    0 讨论(0)
提交回复
热议问题