Параметризация метода ActiveRecord #joins - PullRequest
0 голосов
/ 03 июля 2019

Я рефакторинг довольно сложного запроса, который включает в себя объединение нескольких .joins методов вместе.В одном из этих объединений я использую необработанный запрос SQL, который использует интерполяцию строк, то есть объединение WHERE foo.id = #{id}.Мне известно, что я могу параметризовать ActiveRecord #where, используя переменную ? и передавая аргументы в качестве параметров, но метод соединений не поддерживает множественные аргументы таким образом.Например:

Использование:

Post.my_scope_name.joins("LEFT JOIN posts ON posts.id = images.post_id and posts.id = ?", "1") для передачи идентификатора 1 создает ActiveRecord::StatementInvalid

, поскольку сгенерированный SQL выглядит следующим образом:

"LEFT JOIN posts ON posts.id = images.post_id and posts.id = ? 1"

Каков стандартный подход к параметризации запросов при использовании метода joins?

1 Ответ

2 голосов
/ 03 июля 2019

arel «Реляционная алгебра» является базовым ассемблером запросов для Rails и может использоваться для построения запросов, условий, объединений, CTE и т. Д., Которые не поддерживаются в Rails высокого уровня. Поскольку эта библиотека является неотъемлемой частью Rails, большинство методов запросов Rails будут поддерживать прямое внедрение Arel объектов без проблем (если честно, большинство методов в любом случае преобразуют ваши аргументы в один из этих объектов).

В вашем случае вы можете построить желаемое соединение следующим образом:

  posts_table = Post.arel_table
  images_table = Image.arel_table 
  some_id = 1

  post_join = Arel::Nodes::OuterJoin.new(
    posts_table,
    Arel::Nodes::On.new(
      posts_table[:id].eq(images_table[:post_id])
        .and(posts_table[:id].eq(some_id))
    )
  )

SQL произведено:

  post_join.to_sql
  #=> "LEFT OUTER JOIN [posts] ON [posts].[id] = [images].[post_id] AND [posts].[id] = 1"

Затем вы просто добавляете это объединение к вашему текущему запросу

  Image.joins(post_join)
  #=> SELECT images.* FROM images LEFT OUTER JOIN [posts] ON [posts].[id] = [images].[post_id] AND [posts].[id] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...