范围与" WHERE ... LIKE"在相关的表

时间:2015-05-25 12:46:17

标签: ruby-on-rails ruby postgresql activerecord rails-activerecord

我试图从Postgresql表(table1)中获取数据,该表由其他相关表(property)的字段(table2)过滤。

在纯SQL中,我会像这样编写查询:

SELECT * FROM table1 JOIN table2 USING(table2_id) WHERE table2.property LIKE 'query%'

这很好用:

scope :my_scope, ->(query) { includes(:table2).where("table2.property": query) }

但我真正需要的是使用LIKE运算符进行过滤而不是严格相等。但是这不起作用:

scope :my_scope, ->(query) { includes(:table2).where("table2.property LIKE ?", "#{query}%") }

我收到此错误:

PG::UndefinedTable: ERROR: missing FROM-clause entry for table "table2" LINE 1: ...ble2" WHERE "table1"."user_id" = $1 AND (tabl... ^ : SELECT "table1".* FROM "table1" WHERE "table1"."user_id" = $1 AND (table2.property LIKE 'query%') ORDER BY last_used_at DESC

我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

.includes()通常运行2个单独的查询,除非它可以发现您的条件强制执行单个LEFT OUTER JOIN查询,但在您的情况下它不能这样做,因为引用是在字符串中(请参阅{{ 3}})。

您可以通过指定.references(:table2)

来强制执行单个查询行为
scope :my_scope, ->(query) { includes(:table2)
                               .references(:table2)
                               .where("table2.property LIKE ?", "#{query}%") }

或者您可以使用.eager_load()

scope :my_scope, ->(query) { eager_load(:table2)
                               .where("table2.property LIKE ?", "#{query}%") }

答案 1 :(得分:0)

通过这种方式尝试,在查询中添加[]

scope :my_scope, ->(query) { includes(:table2).where(["table2.property LIKE (?)", "#{query}%"]) }

还可以尝试添加(?)