Можете ли вы поместить переменную в регулярное выражение?
Я пытаюсь проверить модель.категория равна любому существующему имени категории
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/
Я не знаю, как программировать в Ruby, но это, безусловно, может быть достигнуто путем объединения строки с regexp с вашей строкой, а затем запуска regexp.