【问题标题】:Rails: Can you translate this SQL Query from MySQL to SQlite?Rails:你能把这个 SQL 查询从 MySQL 翻译成 SQlite 吗?
【发布时间】:2011-09-04 21:44:39
【问题描述】:

你能为 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 代码?

【问题讨论】:

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


    【解决方案1】:

    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
    

    代码被盗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
    

    【讨论】:

    • /var/lib/gems/1.8/gems/activerecord-3.0.7/lib/active_record/base.rb:1009:in `method_missing': undefined local variable or method `establish_connection' for ActiveRecord::Base:Class (NameError)
    • 代码在 rails 3.1 上运行良好,我会检查 3.0.7(看起来就是你正在使用的)。
    • 哇太棒了!更新有效!我非常感谢您,感谢您免费为我提供的大力帮助 :) 谢谢!
    【解决方案2】:

    替换这些:

    pre_name REGEXP '.*#{key}.*'
    

    用喜欢:

    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 可能会完成这项工作是没有意义的。

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2020-09-19
      • 1970-01-01
      • 2011-05-20
      • 2011-05-09
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2018-03-26
      相关资源
      最近更新 更多