Rails 5.2.2 (активная запись) оператор WITH - PullRequest
1 голос
/ 07 апреля 2019

Я использую Rails 5.2.2, и у меня сложный запрос с использованием оператора WITH, который мне нужно создать с помощью левого внешнего соединения.

Как мне сделать оператор WITH в активной записи?

Мой TOTAL_PROFILES управляется объектом Query и будет меняться, а остальные всегда будут постоянными.Поэтому я хочу обернуть результаты моего объекта запроса с помощью оператора WITH.

Вот упрощенный пример SQL, и я надеюсь, что кто-то может подсказать мне лучший способ добиться этого в рельсах, поскольку я не вижу способасделать это.У меня есть несколько внутренних соединений в таблице TOTAL_PROFILE, но они здесь не отображаются.

WITH TOTAL_PROFILES
AS (
     SELECT profiles.*
           ,hobbies.*
     FROM profiles
     INNER JOIN 
                 "profiles" 
              ON "hobbies"."hobbyable_id"      = "profiles"."id" 
             AND "hobbies"."hobbyable_type"    = $1 
     WHERE (profiles.latitude  ( BETWEEN 42.055160808444576 
                               AND 42.19989259155542) )
)
, FAVORITE_FOR_USER
    AS (
        SELECT "favorites".* 
          FROM "favorites" 
         WHERE "favorites"."user_id"    = $1 
           AND "favorites"."profile_id" = $2 
         ORDER BY 
               "favorites"."id" ASC LIMIT $3 
       )    
SELECT F."user_id"
     , CASE 
            WHEN F."profile_id" IS NULL
            THEN 0
            ELSE 1
             END                          AS IS_FAVORITE_FOR_USER 
     , T.*           
  FROM 
       TOTAL_PROFILES     T
  LEFT JOIN
       FAVORITE_FOR_USER  F
    ON T."profile_id" = F."profile_id"

Как это можно преобразовать в ActiveRecord или Arel?

a_sql = ProfilesQuery::Search.call(:location => 'New York, NY').to_sql
params = []
params << User.first.id # 1
user_id_param = params.length

wrapper_query = <<~SQL
 SELECT F."user_id"
     , (F."profile_id" IS NOT NULL) AS IS_FAVORITE_FOR_USER
     , T.*
 FROM (#{a_sql}) T
 LEFT JOIN favorites F ON (F.profile_id = T.profile_id AND F."user_id" = $#{user_id_param})
SQL

conn = ActiveRecord::Base.connection.raw_connection
conn.prepare('my_query', wrapper_query )
result = conn.exec_prepared('my_query', ['1'])``
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...