Mysql 我可以在Rails.where()中使用正则表达式吗?

Mysql 我可以在Rails.where()中使用正则表达式吗?,mysql,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,Mysql,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4,我有一个菜单,上面显示了各种艺术家的第一个字母: 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(

我有一个菜单,上面显示了各种艺术家的第一个字母:

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,所以可以利用它对正则表达式的支持。您需要切换到
RLIKE
运算符,并相应地调整操作数

例如,使用现有结构,可以使用以下

filter_letter = (params[:letter] =~ /[a-z]/i ? params[:letter] : "[^a-z]" )
@artists = Artist.where("name RLIKE ?", "^#{filter_letter}")
有关更多信息,请参阅。请特别注意,mysql正则表达式不区分大小写,因此您不必担心这个问题。

您的“此处某物”可以重新表述为“艺术家姓名中不在A-Z中的所有第一个字符的集合。”

我希望()能正常工作,但如果不能,我们可以很容易地修复它。关键是使用子字符串not LIKE,并将Ruby范围表示为SQL IN子句

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)