質問

mysqlのこのレールコードを翻訳できますか:

def Customer.find_by_key(key)
  Customer.find(:all, :conditions => "pre_name REGEXP '.*#{key}.*' 
      OR sur_name REGEXP '.*#{key}.*' 
      OR street REGEXP '.*#{key}.*' 
      OR zip REGEXP '.*#{key}.*' 
      OR city REGEXP '.*#{key}.*' 
      OR phone_1 REGEXP '.*#{key}.*' 
      OR phone_2 REGEXP '.*#{key}.*' 
      OR email REGEXP '.*#{key}.*' 
      OR company REGEXP '.*#{key}.*'")
end

sqlite3コードへ?

役に立ちましたか?

解決

REGEXP 関数は、sqlite3でデフォルトで定義されていません。以前に少し作業を行う必要があります。

これを初期イザー(たとえば)に貼り付けます config/initializers/sqlite_regexp.rb)、Rails 3.1で動作します(Rails 3.0については以下を参照):

require 'active_record/connection_adapters/sqlite3_adapter'

class ActiveRecord::ConnectionAdapters::SQLite3Adapter
  def initialize(db, logger, config)
    super
    db.create_function('regexp', 2) do |func, pattern, expression|
      regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)

      if expression.to_s.match(regexp)
        func.result = 1
      else
        func.result = 0
      end
    end
  end
end

盗まれたコード ここ.

もちろん、 @Muの回答のようにクエリを書き直すこともできますが、機能を実際に実装する方法を知っているといいと思いました。

アップデート

上記のコードはRails 3.0で機能しません。これは機能するはずです。

require 'active_record/base'
require 'active_record/connection_adapters/sqlite_adapter'

module ActiveRecord::ConnectionAdapters
  class SQLite3Adapter < SQLiteAdapter
    def initialize(db, logger, config)
      super
      db.create_function('regexp', 2) do |func, pattern, expression|
        regexp = Regexp.new(pattern.to_s, Regexp::IGNORECASE)

        if expression.to_s.match(regexp)
          func.result = 1
        else
          func.result = 0
        end
      end
    end
  end
end

他のヒント

これらを置き換えます:

pre_name REGEXP '.*#{key}.*'

with with:

pre_name LIKE '%#{key}%'

または、プレースホルダーを使用してください。

:conditions => [
    "pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
    { :pattern => '%' + key + '%' }
]

sqlite regexpを理解していますが、デフォルトでは実装されていません, 、自分で実装する必要があります。実装を追加することはできますが、おそらく仕事をするような点はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top