RAILS:您可以将此SQL查询从MySQL转换为SQLite吗?
-
22-10-2019 - |
题
您可以为MySQL翻译此Rails代码:
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}.*'
像:
pre_name LIKE '%#{key}%'
或者更好,请使用占位符:
:conditions => [
"pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
{ :pattern => '%' + key + '%' }
]
sqlite 了解REGEXP,但默认情况下没有实现, ,您必须自己实施。您可以添加您的实现,但是毫无意义地可以完成这项工作。
不隶属于 StackOverflow