Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在Rails中选择以数字开头的行?_Mysql_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 3.1 - Fatal编程技术网

Mysql 如何在Rails中选择以数字开头的行?

Mysql 如何在Rails中选择以数字开头的行?,mysql,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.1,Mysql,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,我有一个显示索引中项目的页面 我可以通过以下方式通过信函获取项目: scope :by_letter, lambda { |letter| where("name LIKE '#{letter}%'") } 但对于以数字(0-9)开头的名称,我无法找到一个优雅的解决方案 我如何重写这个或一个单独的作用域,以便搜索以数字开头的名称? 编辑:我正在尝试一次性获取以0-9开头的所有行(不是每个数字都单独获取)。这应该可以 scope :starts_with_number, where("name

我有一个显示索引中项目的页面

我可以通过以下方式通过信函获取项目:

scope :by_letter, lambda { |letter| where("name LIKE '#{letter}%'") }
但对于以数字(0-9)开头的名称,我无法找到一个优雅的解决方案

我如何重写这个或一个单独的作用域,以便搜索以数字开头的名称?

编辑:我正在尝试一次性获取以0-9开头的所有行(不是每个数字都单独获取)。

这应该可以

scope :starts_with_number, where("name REGEXP '[0-9]%'")
这应该行得通

scope :starts_with_number, where("name REGEXP '[0-9]%'")

以下是我最终如何做到这一点:

@letter_merchants = []
(0..9).to_a.each do |digit|
  @letter_merchants |= Merchant.by_letter(digit)
end

以下是我最终如何做到这一点:

@letter_merchants = []
(0..9).to_a.each do |digit|
  @letter_merchants |= Merchant.by_letter(digit)
end

雅各布,试试这个稍微改写的版本,看看你最终得到了什么:

@letter_merchants = (0..9).map { |d| Merchant.by_letter(d) }

请注意,这只说明Ruby语言有多么棒,而不是如何解决问题(会有太多的数据库调用)。

Jacob,尝试一下这个稍微重写的版本,您最终得到的结果是:

@letter_merchants = (0..9).map { |d| Merchant.by_letter(d) }

请注意,这应该只是说明Ruby语言有多棒,而不是如何解决问题(会有太多的数据库调用)。

REGEXP的一个缺点是它不能使用索引。然而

scope :starts_with_number, where("name >= '0' and name < ':')
范围:以\u编号开始,其中(“名称>='0'和名称<':')

可以在名称上使用索引。它确实依赖于字符0-9:的精确顺序,在ascii、utf8等任何字符之间都不会出现这种情况,但如果使用ebcdic或类似疯狂的东西,则不会出现这种情况。

REGEXP的一个缺点是它不能使用索引。但是

scope :starts_with_number, where("name >= '0' and name < ':')
范围:以\u编号开始,其中(“名称>='0'和名称<':')

可以对名称使用索引。它确实依赖于字符0-9:精确地按顺序排列,在ascii、utf8等任何字符之间没有任何字符,但如果您使用ebcdic或类似疯狂的字符,则不会出现这种情况。

您是否尝试过
Model.by_letter(“1”)
。它应该会起作用。只要将名称更改为“按字符”,就可以了!:)更新了问号:)--我的意思是一次性获取以数字开头的行。是否尝试了
Model.by_字母(“1”)
。它应该会起作用。只要将名称更改为“按字符”,就可以了!:)更新了问号:)--我的意思是一次性获取以数字开头的行。太棒了!比我下面的解决方案好得多。谢谢@雅各布把它改成了Regexp,太棒了!比我下面的解决方案好得多。谢谢@Jacob将其修复为使用REGEXPWow,这太棒了!谢谢哇,太棒了!谢谢just to be mean=>此代码将执行多少查询?just to be mean=>此代码将执行多少查询?