Sql ActiveRecord Where子句-单引号错误?

Sql ActiveRecord Where子句-单引号错误?,sql,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,Sql,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Activerecord,在ActiveRecord(使用Ruby on Rails)中,如果我有@products变量,其中@products=Product.all,我会说: @products.where(“name='check123'),如果我转到@products.where('name='check123')),它将返回一个与该条件匹配的对象数组。如果('name=“check123”')我得到一个错误 : SELECT "products".* FROM "products" WHERE (name =

在ActiveRecord(使用Ruby on Rails)中,如果我有
@products
变量,其中
@products=Product.all
,我会说:

@products.where(“name='check123')
,如果我转到
@products.where('name='check123'))
,它将返回一个与该条件匹配的对象数组。如果('name=“check123”')我得到一个错误

: SELECT "products".* FROM "products" WHERE (name = "check123")
Hirb Error: PG::UndefinedColumn: ERROR:  column "check123" does not exist
LINE 1: SELECT "products".* FROM "products" WHERE (name = "check123"...
                                                      ^
为什么会这样?似乎我必须始终在where子句中的所有内容周围使用双引号,并对其中的任何字符串使用单引号

单引号在这里不应该也起作用吗,或者是有什么我不明白的吗

其他一些意见:

@products.where(“cost='23.0')
可以工作,但23的数据类型是整数而不是字符串?
@products.where('cost=23')
有效,因此我知道我可以在where子句中使用单引号


注意:我知道在where子句中使用“?”语法是为了避免sql注入,我特意尝试这样执行查询。

双引号用于命名数据库对象(表名、列名、用户名、架构名…),而单引号用于表示用作值的字符串

因此,您的
UndefinedColumn:ERROR
与使用
@products进行筛选时一样有意义。其中('name=“check123”)
生成的SQL将是
。。。。其中name=“check123”
。db引擎正在尝试查找名为
check123
的列,并将其值与列
name
的值相匹配。由于表中不存在列
check123
,因此会出现“未定义列名”错误

关于你的另一个问题:

当您使用字符串值筛选整型列时,发生的情况是db引擎将列值隐式转换为字符串以执行搜索

更新
通用SQL标准由描述。总而言之,大多数数据库引擎遵循大多数ANSI标准,双引号的使用通常是为数据库对象保留的。

“双引号-Db对象,单引号-string”->这是专门用于内部WHERE子句的原因吗?另外,你能提供一个参考吗?我已经用你的参考更新了答案,让我们知道这对你来说是否足够。我很好奇你为什么故意把一个加载的RPG指向你自己的脚。