2016-10-13 11 views
0

В моем проекте у меня разные временные фрагменты. Эти срезы времени имеют такие имена, как «00-04», «04-08», «08-12», «12-16», «16-20» и «20-24» и многое другое. Я хотел все время нарезать объекты с указанными именами. Итак, я запрограммировал следующее:SQLite3 :: SQLException: нет такой функции: REGEXP rails rspec

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

Я считаю, что лучше использовать тот же адаптер DB для Dev/тест/прод. Однако проверьте [this] (http://stackoverflow.com/questions/5071601/how-do-i-use-regex-in-a-sqlite-query) вне (игнорируйте принятый ответ). – ndn

+1

@sadiksha У меня тоже мало знаний о части SQLite. Поэтому, если он работает с MySQL, а не с SQLite, n ошибка явно говорит о том, что SQLite не реализовал эту функцию regexp. Поэтому лучше использовать тот же Db для всех envs, что и ndn. – Autodidact

+0

Спасибо, и @ndn, для этого случая я использовал запрос для обработки массивов. Я обязательно рассмотрю ваше предложение. –

ответ

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