Можете ли вы поместить переменную в регулярное выражение? - PullRequest
6 голосов
/ 13 сентября 2010

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

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

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

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

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

Ответы [ 4 ]

23 голосов
/ 13 сентября 2010

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

>> s = "thing"
=> "thing"
>> r = /#{s}/
=> /thing/
2 голосов
/ 13 сентября 2010

Я не могу понять, в чем ваша настоящая проблема с сокращением, но я полагаю, что перед сравнением вы должны были сократить существующие категории. Я полагаю, что регулярное выражение здесь не поможет, так как «=>» в условиях является точным сравнением с учетом регистра (по умолчанию в БД), а регулярное выражение не поддерживается 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"]

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

2 голосов
/ 13 сентября 2010
x = 'fluffy'
Regexp.new x.to_s

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

0 голосов
/ 13 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...