我正在使用find_by_sql执行SQL查询.我希望能够使用Soundex和Levenshtein,但为了使用Levenshtein,我需要将该函数作为文件包含在内.
到目前为止这是我的代码:
info = params[:email].split('@')
name = info[0]
domain = info[1]
levenshtein = File.open("./lib/assets/mysql-function-levenshtein.sql")
results = Domain.find_by_sql(
"" + levenshtein + "
SELECT *
FROM domains
WHERE domain = '" + domain + "'"
)
Run Code Online (Sandbox Code Playgroud)
我不知道在查询中简单地包含它是否有效.
什么是最好的实施?
顺便说一句,我试图包含的文件是:https: //github.com/vyper/levenshtein-sql
首先,我认为您最好只使用迁移在数据库中定义该函数,因此您不必为要使用它的每个查询再次定义它:
class AddLevenShteinFunctionToDatabase < ActiveRecord::Migration
def up
levenshtein = File.read("/path/to/levenshtein.sql")
execute levenshtein
end
def down
# maybe put some code here to delete the function
end
end
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您还可以向Domain模型添加范围以执行以下类型的查询:
scope :levenshtein, lambda {|s1, s2| select("levenshein(#{s1}, #{s2})") }
Run Code Online (Sandbox Code Playgroud)
有了这个,您应该能够像这样编写查询:
results = Domain.levenshtein("LEONARDO", "LEONARDU").where(:domain => domain)
Run Code Online (Sandbox Code Playgroud)