2

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 + "'"
)

我不知道只是将它包含在查询中是否有效。

最好的实现是什么?

顺便说一下,我要包含的文件是: https ://github.com/vyper/levenshtein-sql

4

1 回答 1

6

首先,我认为您最好通过迁移在数据库中定义该函数,这样您就不必为要使用它的每个查询再次定义它:

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

完成此操作后,您还可以为Domain模型添加范围以执行以下类型的查询:

scope :levenshtein, lambda {|s1, s2| select("levenshein(#{s1}, #{s2})") }

有了这个,您应该能够编写如下查询:

results = Domain.levenshtein("LEONARDO", "LEONARDU").where(:domain => domain)
于 2012-07-16T09:13:32.733 回答