我正在寻找编写一个 ActiveRecord 查询,这就是我下面的内容。不幸的是,您不能像这样使用 OR。最好的执行方式是什么? category_ids
是一个整数数组。
.where(:"categories.id" => category_ids).or.where(:"category_relationships.category_id" => category_ids)
我正在寻找编写一个 ActiveRecord 查询,这就是我下面的内容。不幸的是,您不能像这样使用 OR。最好的执行方式是什么? category_ids
是一个整数数组。
.where(:"categories.id" => category_ids).or.where(:"category_relationships.category_id" => category_ids)
一种方法是恢复到原始 sql ...
YourModel.where("categories.id IN ? OR category_relationships.category_id IN ?", category_ids, category_ids)
保留 SQL 并使用 ARel,如下所示:
.where(Category.arel_table[:id].in(category_ids).
or(CategoryRelationship.arel_table[:category_id].in(category_ids))
假设您要返回类别,则需要 OUTER JOIN category_relationships 并在组合表上放置 OR 条件。
Category.includes(:category_relationships).where("categories.id IN (?) OR category_relationships.category_id IN (?)",category_ids,category_ids )
此查询通过组合categories
和的列来创建一个外连接表category_relationships
。与内连接(例如Category.joins(:category_relationships)
)不同,外连接表也将categories
没有关联category_relationship
。然后它将where
在外部连接表上应用条件 in 子句以返回匹配的记录。
includes
对关联没有条件的语句通常会进行两个单独的 sql 查询来检索记录及其关联。但是,当与关联表上的条件一起使用时,它将进行单个查询来创建外连接表并在外连接表上运行条件。这也允许您检索没有关联的记录。
有关详细说明,请参阅此内容。
您要做的是手动编写查询的 OR 部分,如下所示:
.where("category.id in (#{category_ids.join(',')}) OR category_relationships.category_id in (#{category_ids.join(',')})")