2

find_by_sqlSQLクエリの実行に使用しています。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 に答える