ActiveRecord - 左连接过滤列表

ActiveRecord - left join on filtered list

我有以下 类:

Parent
  has_many :children

Child
  belongs_to :parent
  belongs_to :other

我希望能够左加入 parents 和 children 并通过其他协会过滤 children。我通过编写自定义连接子句实现了这一点:

joins("LEFT JOIN children ON children.parent_id=parents.id AND children.other_id IN (#{ids.join(",")})")

似乎应该有一个更 Rails-y 的方法来实现这一点,它不涉及自定义连接子句。有什么想法吗?

您可以为该连接使用 Arel,因为 ActiveRecord 连接不允许绑定参数:

children = Children.arel_table
parents = Parent.arel_table
join = children
  .join(parents, Arel::Nodes::OuterJoin)
  .on(
    children[:parent_id]
      .eq(parents[:id])
      .and(children[:other_id].in(ids))
  )
  
Children.joins(join.join_sources)

想法是像往常一样创建 LEFT (OUTER) JOIN,然后添加 and(children[:other_id].in(ids)),这使得 AND ... IN (...).