You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6使用Arel构建查询生成SQL缺失*通配符报错如何处理?

这不是Arel的bug,属于API用法不符合设计预期导致的问题。

Arel作为Rails底层的SQL抽象构建工具,设计上不会自动添加隐式的查询字段:你直接调用Arel::Table#where方法仅会给查询添加WHERE条件,不会自动补全SELECT子句的内容,所以生成的SQL里缺失*是符合设计的行为。

要得到你期望的查询结果,有两种常用的正确写法:

写法1:构建完整的Arel查询对象

显式调用project方法指定要查询的字段,查询全部字段可以用Arel.star来指代*:

users = ::MyModule::User.arel_table
# 先指定要查询的字段,再添加WHERE条件
query = users.project(Arel.star).where(users[:name].eq('amy'))

此时执行query.to_sql就会输出你预期的:

"SELECT * FROM `users` WHERE `users`.`name` = 'amy'"

如果需要查询指定字段,直接把对应字段传给project方法即可,示例:

# 只查询id和name字段
query = users.project(users[:id], users[:name]).where(users[:name].eq('amy'))

写法2:结合ActiveRecord查询链使用(更推荐的常规用法)

大多数场景下不需要手动构建完整的Arel查询对象,直接把Arel条件传给ActiveRecord的where方法即可,ActiveRecord会自动处理SELECT子句,无需手动调用project:

users = ::MyModule::User.arel_table
::MyModule::User.where(users[:name].eq('amy')).to_sql

这种写法的输出也会默认携带*,如果你之前调用过select方法指定了字段,也会自动同步到生成的SQL中。


内容的提问来源于stack exchange,提问作者Sylar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:21:03