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