Postgres查询控制台正常 放入Rails模型scope视图调用报语法错误
错误原因
你遇到的语法错误是对ActiveRecord各查询方法的职责边界理解有误导致的:
- ActiveRecord的
joins方法仅用于拼接SQL的JOIN子句,该子句只允许定义表关联的匹配条件(也就是ON之后的内容),不能直接在里面插入WHERE、ORDER BY这类属于其他SQL语法段的内容。 - 你最初的代码把过滤条件、排序逻辑都写在了
joins的参数里,导致ActiveRecord生成最终SQL时,会把WHERE错误拼接到JOIN ON的关联条件后面,不符合PostgreSQL的语法规范,就抛出了对应的语法错误。
你单独运行的原生SQL完全合法,因为原生SQL的结构严格按照SELECT ... FROM ... JOIN ... ON ... WHERE ... ORDER BY ...的顺序排布,和你修正后拆分调用select/joins/where/order方法生成的SQL结构完全一致,所以可以正常执行。
可选优化建议
你修正后的代码已经可以正常运行,还可以进一步把where条件改成ActiveRecord哈希写法,避免手写SQL的注入风险,也更符合Rails开发惯例:
scope :with_current_price_version, -> { select("DISTINCT ON (subscriptions.id) subscriptions.id, subscription_carts.authorized_at as version_cart_authorized_at, subscriptions.*") .joins("INNER JOIN subscription_carts on subscription_carts.subscription_id = subscriptions.id AND subscription_carts.plan_id = subscriptions.plan_id") .where(subscription_carts: { status: 'processed' }, subscriptions: { status: ['authorized','in_trial', 'paused'] }) .order("subscriptions.id, subscription_carts.authorized_at") }
内容的提问来源于stack exchange,提问作者pinkfloyd90
相关产品推荐
相关产品推荐

