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

时间:2011-09-04 21:44:40

标签: mysql ruby-on-rails sqlite ruby-on-rails-3.1

你可以翻译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代码?

2 个答案:

答案 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