SQLite3::SQLException: нет такой функции: REGEXP rails rspec

В моем проекте у меня есть разные временные отрезки. Эти временные отрезки имеют такие имена, как «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')

Моя база данных.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?


person Sadiksha Gautam    schedule 13.10.2016    source источник
comment
Я считаю, что лучше использовать один и тот же адаптер БД для dev/test/prod. Однако проверьте это (игнорируйте принятый ответ ).   -  person ndnenkov    schedule 13.10.2016
comment
@sadiksha У меня тоже мало знаний о части SQLite. Поэтому, если он работает с MySQL, а не с SQLite, ошибка ясно говорит о том, что SQLite не реализовал эту функцию регулярного выражения. Так что лучше используйте один и тот же Db для всех окружений, как предложил ndn.   -  person Autodidact    schedule 14.10.2016
comment
Спасибо вам и @ndn, в этом случае я использовал запрос для обработки массивов. Я обязательно рассмотрю ваше предложение.   -  person Sadiksha Gautam    schedule 17.10.2016
comment
@SadikshaGautam было бы лучше, если бы вы опубликовали ответ с вашим текущим решением и приняли его для поиска будущими пользователями.   -  person ndnenkov    schedule 17.10.2016


Ответы (1)


Итак, согласно разным ответам в Как включить REGEXP в SQLite3 и 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, где поле = ? массив возможных значений

person Bibek Shrestha    schedule 18.10.2016