gpt4 book ai didi

ruby-on-rails - 如何将 Ruby 函数放入 SQLite3 查询中?

转载 作者:行者123 更新时间:2023-12-05 02:24:17 25 4
gpt4 key购买 nike

我有一个函数需要放入 SQLite3 查询中。

我有以下方法:

def levenshtein(a, b)
case
when a.empty? then b.length
when b.empty? then a.length
else [(a[0] == b[0] ? 0 : 1) + levenshtein(a[1..-1], b[1..-1]),
1 + levenshtein(a[1..-1], b),
1 + levenshtein(a, b[1..-1])].min
end
end

我想做一个看起来像这样的查询:

@results = The_db.where('levenshtein("name", ?) < 3', '#{userinput}')

我想在 The_db 中查找 name 的值,其中 name 列的值与用户输入之间的编辑距离小于 3。问题是我不知道如何在查询中使用 Ruby 函数。这可能吗?

最佳答案

看看 create_function method .您可以使用它来创建这样的自定义函数(您已经定义了 levenshtein Ruby 方法):

db.create_function "levenshtein", 2 do |func, a, b|
func.result = levenshtein(a, b)
end

然后您可以在 SQL 中使用它:

# first set up some data
db.execute 'create table names (name varchar(30))'
%w{Sam Ian Matt John Albert}.each do |n|
db.execute 'insert into names values (?)', n
end

#Then use the custom function
puts db.execute('select * from names where levenshtein(name, ?) < 3', 'Jan')

在这个例子中输出是

Sam
Ian
John

我还没有在 Rails 中测试过这个,但我认为它应该可以工作,查询字符串只是传递到数据库。您可以使用 ActiveRecord::Base.connection.raw_connection 获取 Sqlite db 对象. (我不知道如何配置 Rails 以便所有 ActiveRecord 连接都定义了该函数——如果您在 Controller 中添加该函数,它似乎确实有效,但这并不理想)。

在展示了如何完成后,我不确定它是否应该在网络应用程序中完成。您可能不想在生产中使用 Sqlite。如果您使用例如,它可能会有用。 Postgres 在生产中有自己的 levenshtein 函数(如 the Tin Man’s answer 中所建议),但想在开发中使用 Sqlite。

关于ruby-on-rails - 如何将 Ruby 函数放入 SQLite3 查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13939574/

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