你可以翻译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代码?
答案 0 :(得分:3)
替换这些:
pre_name REGEXP '.*#{key}.*'
与LIKE:
pre_name LIKE '%#{key}%'
或者更好,使用占位符:
:conditions => [
"pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
{ :pattern => '%' + key + '%' }
]
SQLite understands REGEXP but it is not implemented by default,您必须自己实现它。你可以添加你的实现,但是当LIKE可能会完成这项工作时没有意义。
答案 1 :(得分:3)
在sqlite3中默认没有定义REGEXP
函数,你以前必须做一些工作。
将其粘贴在初始化程序中(例如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
代码被盗here。
你当然可以在@ 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