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
相关产品推荐
相关产品推荐

