我的表/模型有一个TEXT
类型的列,当在模型本身上过滤记录时,AR where
会生成正确的SQL并返回正确的结果,这就是我的意思:
MyNamespace::MyValue.where(value: 'Good Quality')
生成此 SQL 语句:
SELECT `my_namespace_my_values`.*
FROM `my_namespace_my_values`
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
再看一个例子,我正在连接MyNamespace::MyValue
并在同一value
列上对另一个模型(具有到my_values
的关系)进行过滤。请查看此查询(query #2):
OtherModel.joins(:my_values).where(my_values: { value: 'Good Quality' })
这不会产生正确的查询结果,它将value
列过滤为字符串列而不是文本列,因此产生了不正确的结果,例如(仅粘贴相关部分):
WHERE my_namespace_my_values`.`value` = 'Good Quality'
现在我可以通过在我的 AR where
子句中使用 LIKE 来解决这个问题,这将产生正确的结果,但查询略有不同。这就是我的意思:
OtherModel.joins(:my_values).where('my_values.value LIKE ?, '%Good Quality%')
最后来到我的问题。 这是什么,它是如何为模型上的哪个位置(对于文本列类型)生成的?
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
也许最重要的问题是,使用哪种方式在性能方面有何差异:
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
还有这个:
(my_namespace_my_values.value LIKE '%Good Quality%')
更重要的是,我如何让我的具有连接的查询(查询 #2)产生以下类似的结果:
WHERE `my_namespace_my_values`.`value` = '\\\"Good Quality\\\"'
"innodb_version", "5.6.27"
,["protocol_version", "10"]
,["slave_type_conversions", ""]
,["version", "5.6.27-log"]
,["version_comment", "MySQL Community Server (GPL)"]
,["version_compile_machine", "x86_64"]
,["version_compile_os", "Linux"]
。 - ant