代码之家  ›  专栏  ›  技术社区  ›  Trip

你能在regexp中放一个变量吗?

  •  6
  • Trip  · 技术社区  · 14 年前

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

    我必须在这里放置downcase,以确保它们都是downcase,这样它们就可以作为字符串进行匹配。但是在保存之前更新属性是服务器的一大难题,我想通过regexp来匹配它们。像这样的

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

    有这样的可能吗?还是有更好的办法?

    4 回复  |  直到 14 年前
        1
  •  2
  •   gertas    14 年前

    我不明白你的降格到底有什么问题,但我想你必须先降格现有的类别,然后再进行比较。我认为regexp在这里没有帮助,因为在conditions中as“=>”是完全区分大小写的比较(在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"]
    

    存在吗?方法应使用:conditions参数,如上所述。 如果这对你造成了任何DB的打击,比如说,你有数百万个类别。然后您应该使用downcased name创建单独的列,并将其与简单的“=>”条件进行比较。

        2
  •  23
  •   mipadi    14 年前

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

    >> s = "thing"
    => "thing"
    >> r = /#{s}/
    => /thing/
    
        3
  •  2
  •   vise    14 年前
    x = 'fluffy'
    Regexp.new x.to_s
    

        4
  •  0
  •   Tomasz Kowalczyk    14 年前

    我不知道如何在Ruby中编程,但它肯定可以通过将字符串与regexp和您的字符串连接起来,然后运行regexp来实现。