加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 相关表格中“WHERE … LIKE”的范围

发布时间:2020-12-17 02:48:26 所属栏目:百科 来源:网络整理
导读:我正在尝试从 Postgresql表(table1)中获取数据,该表由其他相关表(table2)的字段(属性)过滤. 在纯SQL中,我会像这样编写查询: SELECT * FROM table1 JOIN table2 USING(table2_id) WHERE table2.property LIKE 'query%' 这很好用: scope :my_scope,-(query)
我正在尝试从 Postgresql表(table1)中获取数据,该表由其他相关表(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

我在这做错了什么?

解决方法

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

您可以通过指定.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}%") }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读