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 (...)
.
我有以下 类:
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 (...)
.