Можете ли вы поместить переменную в регулярное выражение?

Я пытаюсь проверить модель.категория равна любому существующему имени категории

unless Category.exists?(:name => self.category.downcase)

мне пришлось положить downcase в этом, чтобы убедиться, что все они были понижены, чтобы они могли соответствовать как строки. Но его большой сервер ударил, чтобы обновить атрибут before_save, и я думал просто сопоставить их с помощью regexp. Что-то вроде этого!--3-->

unless Category.exists?(:name => /#{self.category}/ }

возможно ли что-то подобное? Или есть лучший способ сделать это?

4 ответов


Я не могу понять, в чем ваша настоящая проблема здесь с понижением, но я полагаю, что вам пришлось сначала понизить существующие категории перед сравнением. Я полагаю, что regexp не поможет здесь, потому что как "=>" в условиях-точное сравнение с учетом регистра (по умолчанию в DBs), а regexp не поддерживается AR. Вы должны сделать это по-другому:

PostgreSQL:

books = Book.find :all, :conditions => [ "authors ILIKE ?", "smith" ]

Mysql:

author = "Smith".downcase
books = Book.find :all, :conditions => [ "LOWER(authors) LIKE ?", "#{author}" ]

или

books = Book.find :all, :conditions => [ "authors LIKE ? COLLATE utf8_general_ci", "smith"]

существовать? метод должен работать с : параметр условий, как указано выше. Если это вызывает любой удар БД для вас, например, у вас есть миллионы категорий. Затем вы должны создать отдельный столбец с уменьшенным именем и сравнить его с простым условием"=>".


Да, вы можете использовать интерполяцию переменных в регулярном выражении.

>> s = "thing"
=> "thing"
>> r = /#{s}/
=> /thing/

x = 'fluffy'
Regexp.new x.to_s

возможно, есть лучший способ.


Я не знаю, как программировать в Ruby, но это, безусловно, может быть достигнуто путем объединения строки с regexp с вашей строкой, а затем запуска regexp.