SQLite3 :: SQLException:没有这样的函数:REGEXP rails rspec

时间:2016-10-13 14:35:21

标签: regex ruby-on-rails-4 rspec sqlite ruby-2.1

在我的项目中,我有不同的时间片。这些时间片具有诸如“00-04”,“04-08”,“08-12”,“12-16”,“16-20”和“20-24”等名称。我想得到所有时间切片对象与上述名称。所以,我编写了以下内容:

time_slice_names = ["00-04", "04-08", "08-12", "12-16", "16-20", "20-24"]
time_slices = TimeSlice.where('name REGEXP ?', time_slice_names.join("|"))

time_slices在我的开发模式下为我提供了正确的对象。但是,当我运行测试时,我的错误为:

 ActiveRecord::StatementInvalid:
 SQLite3::SQLException: no such function: REGEXP: SELECT "time_slices".* FROM "time_slices"  WHERE (name REGEXP '00-04|04-08|08-12|12-16|16-20|20-24')

我的database.yml如下:

  development:
    adapter: mysql2
    database: development 
    encoding: utf8
    pool: 5
    timeout: 5000

  test:
    adapter: sqlite3
    database: db/test.sqlite3
    pool: 5
    timeout: 5000

我知道我的测试环境使用sqlite3,而我的开发环境使用mysql2。无论如何我可以在mysql2和sqlite3上执行上述查询吗?

1 个答案:

答案 0 :(得分:1)

因此,根据How to turn on REGEXP in SQLite3 and Rails 3.1?中的不同答案,regexp()默认情况下不是在Sqlite3中定义的。您必须安装一个本机扩展,将此功能添加到Sqlite3。

但是,您可以在不使用正则表达式的情况下完成查询。

time_slice_names = ["00-04", "04-08", "08-12", "12-16", "16-20", "20-24"]
time_slices = TimeSlice.where(name: time_slice_names)

内部数据库适配器(mysql或sqlite3)应该理解这一点并将其转换为支持where field in (x, y, z)查询。

提供更多信息ActiveRecord where field = ? array of possible values