gpt4 book ai didi

ruby - 不区分大小写,例如在带有 Postgresql 的 Datamapper 中(ilike)

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:47 32 4
gpt4 key购买 nike

我们在 Sinatra 应用程序中使用 Datamapper,并希望使用不区分大小写的方式,就像在 Sqlite(本地开发中)和 Postgresql(在生产中的 Heroku 上)一样。

我们有这样的语句

TreeItem.all(:name.like =>"%#{term}%",:unique => true,:limit => 20)

如果 term 是“BERL”,我们会从 Sqlite 和 Postgresql 后端得到建议“BERLIN”。但是,如果 term 是“Berl”,我们只能从 Sqlite 而不是 Postgresql 获得该结果。

我想这与 dm-postgres-adapter 和 dm-sqlite-adapter 在生成的 SQL 查询中输出 LIKE 这一事实有关。由于 Postgresql 有一个区分大小写的 LIKE 我们得到了这个(对我们来说不想要的)行为。

有没有办法像在 Datamapper 中一样不区分大小写,而无需诉诸对适配器使用原始 SQL 查询或修补适配器以使用 ILIKE 而不是 LIKE

我当然可以使用介于两者之间的东西,例如:

TreeItem.all(:conditions => ["name LIKE ?","%#{term}%"],:unique => true,:limit => 20)

但是这样我们就会在自己的代码中使用 Postgresql 而不仅仅是作为适配器的配置。

最佳答案

通过编写我自己的覆盖 like_operator 方法的数据对象适配器,我设法获得了 Postgres 的不区分大小写的 ILIKE

require 'do_postgres'
require 'dm-do-adapter'

module DataMapper
module Adapters

class PostgresAdapter < DataObjectsAdapter

module SQL #:nodoc:
private

# @api private
def supports_returning?
true
end

def like_operator(operand)
'ILIKE'
end
end

include SQL

end

const_added(:PostgresAdapter)

end
end

最终我决定移植有问题的应用程序以使用文档数据库。

关于ruby - 不区分大小写,例如在带有 Postgresql 的 Datamapper 中(ilike),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659045/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com