【问题标题】:Can I use Regex in Rails .where()?我可以在 Rails .where() 中使用正则表达式吗?
【发布时间】:2013-12-01 15:59:26
【问题描述】:

我有一个显示不同艺术家首字母的菜单:

A B C D E F ...

它基本上是一种通过名字的第一个字母过滤许多艺术家的方法。

有些问题以符号、数字或[a-z]以外的任何东西开头。

所以我希望它是

# A B C D E F ...

但是我该如何使用 where 子句来实现它呢?

filter_letter = (params[:letter] =~ /[a-z]/i ? params[:letter] : "something_here" )

@artists = Artist.where("name LIKE ?", "#{filter_letter}%")

【问题讨论】:

    标签: mysql ruby-on-rails ruby activerecord ruby-on-rails-4


    【解决方案1】:

    由于您使用的是 mysql,因此您可以利用它对正则表达式的支持。您需要切换到 RLIKE 运算符并相应地调整您的操作数。

    例如,使用您现有的结构,您可以使用以下内容

    filter_letter = (params[:letter] =~ /[a-z]/i ? params[:letter] : "[^a-z]" )
    @artists = Artist.where("name RLIKE ?", "^#{filter_letter}")
    

    请参阅http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html 了解更多信息。特别注意mysql正则表达式不区分大小写,所以你不必担心这个问题。

    【讨论】:

      【解决方案2】:

      您的“这里的东西”可以重述为“不在 A-Z 中的艺术家姓名的所有第一个字符的集合。”

      symbolic_artists = Artist.where("SUBSTRING(name, 0, 1) NOT IN (?)", 'A'..'Z')
      symbols = symbolic_artists.map(&:name).map(&:first)
      filter_letter = (params[:letter] =~ /[a-z]/i ? params[:letter] : symbols
      @artists = Artist.where("SUBSTRING(name, 0, 1) IN (?)", filter_letter)
      

      我希望 () 可以正常工作,但如果不能正常工作,我们可以轻松修复它。重点是使用 SUBSTRING 而不是 LIKE,并将 Ruby 范围表示为 SQL IN 子句。

      【讨论】:

        猜你喜欢
        • 2010-09-29
        • 2013-05-23
        • 2011-02-06
        • 2021-06-20
        • 1970-01-01
        • 2014-02-18
        • 2015-03-08
        • 2015-03-21
        • 1970-01-01
        相关资源
        最近更新 更多