你能把变量放在正则表达式中吗?

Tri*_*rip 6 ruby regex validation ruby-on-rails

我正在尝试验证Model.category是否等于任何现有的类别名称

unless Category.exists?(:name => self.category.downcase)
Run Code Online (Sandbox Code Playgroud)

我不得不放下这个以确保所有这些都是羽绒的,这样它们就可以匹配成串.但它是一个很大的服务器来更新属性before_save,我想通过regexp匹配它们.像这样的东西

unless Category.exists?(:name => /#{self.category}/ }
Run Code Online (Sandbox Code Playgroud)

有可能吗?或者有更好的方法吗?

mip*_*adi 23

是的,你可以在正则表达式中使用变量插值.

>> s = "thing"
=> "thing"
>> r = /#{s}/
=> /thing/
Run Code Online (Sandbox Code Playgroud)

  • 只需添加一个'i':r = /#{s}/i (2认同)

ger*_*tas 2

我无法理解您在小写方面的真正问题是什么,但我想您必须在比较之前先小写现有类别。我想 regexp 在这里不会有帮助,因为条件中的“=>”是精确区分大小写的比较(数据库中的默认值),并且 AR 不支持 regexp。你应该用另一种方式来做:

PostgreSQL:

books = Book.find :all, :conditions => [ "authors ILIKE ?", "smith" ]
Run Code Online (Sandbox Code Playgroud)

数据库:

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

或者

books = Book.find :all, :conditions => [ "authors LIKE ? COLLATE utf8_general_ci", "smith"]
Run Code Online (Sandbox Code Playgroud)

存在吗?方法应与上面的 :conditions 参数一起使用。如果这导致您遇到任何数据库点击,例如您有数百万个类别。然后,您应该创建具有小写名称的单独列,并将其与简单的“=>”条件进行比较。