Rails:你能把这个SQL查询从MySQL翻译成SQlite吗?

Rails:你能把这个SQL查询从MySQL翻译成SQlite吗?,mysql,ruby-on-rails,sqlite,ruby-on-rails-3.1,Mysql,Ruby On Rails,Sqlite,Ruby On Rails 3.1,您能否将此Rails代码翻译为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 REG

您能否将此Rails代码翻译为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代码?

替换这些代码:

pre_name REGEXP '.*#{key}.*'
以类似的方式:

pre_name LIKE '%#{key}%'
或者更好地使用占位符:

:conditions => [
    "pre_name LIKE :pattern OR sur_name LIKE :pattern ...",
    { :pattern => '%' + key + '%' }
]
SQLite,您必须自己实现它。您可以添加您的实现,但没有必要让LIKE完成这项工作。

替换这些:

pre_name REGEXP '.*#{key}.*'
以类似的方式:

pre_name LIKE '%#{key}%'
或者更好地使用占位符:

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

SQLite,您必须自己实现它。您可以添加您的实现,但LIKE可能会完成这项工作,这是毫无意义的。

默认情况下,sqlite3中没有定义
REGEXP
函数,您需要在之前做一些工作

将其粘贴在一个初始值设定项中(例如
config/initializers/sqlite_regexp.rb
),与rails 3.1一起使用(有关rails 3.0,请参见下文):

密码被偷了

当然,您可以像@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
要求“活动记录/基础”
需要“活动\u记录/连接\u适配器/sqlite\u适配器”
模块ActiveRecord::ConnectionAdapters
类SQLite3Adapter
默认情况下,
REGEXP
函数不是在sqlite3中定义的,您必须先做一些工作

将其粘贴在一个初始值设定项中(例如
config/initializers/sqlite_regexp.rb
),与rails 3.1一起使用(有关rails 3.0,请参见下文):

密码被偷了

当然,您可以像@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
要求“活动记录/基础”
需要“活动\u记录/连接\u适配器/sqlite\u适配器”
模块ActiveRecord::ConnectionAdapters
类SQLite3Adapter
/var/lib/gems/1.8/gems/activerecord-3.0.7/lib/active\u record/base.rb:1009:in'method\u missing':未定义的局部变量或方法'build\u connection':activerecord::base:Class(NameError)
该代码在rails 3.1上运行良好,我将检查3.0.7(看起来这就是您正在使用的)。哇哦,太棒了!更新工作!我想对你说声非常感谢,你免费给了我很大的帮助:)谢谢<代码>/var/lib/gems/1.8/gems/activerecord-3.0.7/lib/active\u record/base.rb:1009:in'method\u missing':未定义的局部变量或方法'build\u connection'for activerecord::base:Class(NameError)
代码在rails 3.1上运行良好,我将检查3.0.7(看起来这就是您正在使用的)。哇哦!更新工作!我想对你说声非常感谢,你免费给了我很大的帮助:)谢谢!