Rails:このSQLクエリをMySQLからSQLiteに翻訳できますか?
-
22-10-2019 - |
質問
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を理解していますが、デフォルトでは実装されていません, 、自分で実装する必要があります。実装を追加することはできますが、おそらく仕事をするような点はありません。
所属していません StackOverflow