【问题标题】:How to select rows that start with a digit in Rails?如何在 Rails 中选择以数字开头的行?
【发布时间】:2011-12-18 20:29:57
【问题描述】:

我的页面显示索引中的项目。

我可以使用以下方式逐信获取物品:

scope :by_letter, lambda { |letter| where("name LIKE '#{letter}%'") }

但对于以数字 (0-9) 开头的名称,我想不出一个优雅的解决方案。

如何重写此范围或单独的范围,让我搜索以数字开头的名称?

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

【问题讨论】:

  • 你试过Model.by_letter("1")。它应该工作。只需将名称更改为 by_character 即可! :)
  • 更新了问号:)——我的意思是一次性获取以数字开头的行。

标签: mysql ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1


【解决方案1】:

这应该可以工作

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

【讨论】:

  • 太棒了!比我下面的解决方案好得多。谢谢!
  • @Jacob 将其修复为使用 REGEXP
【解决方案2】:

Jacob,试试这个稍微改写的版本:

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

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

【讨论】:

  • 哇,太棒了!谢谢!
【解决方案3】:

这就是我最终的做法:

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

【讨论】:

  • 只是意思=>这段代码将执行多少个查询?
【解决方案4】:

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

scope :starts_with_number, where("name >= '0' and name < ':')

可以在名称上使用索引。它确实依赖于字符 0-9:完全按照这个顺序,中间没有任何东西,比如 ascii、utf8,但如果你使用 ebcdic 或类似的疯狂的东西,则不会出现这种情况

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 2015-09-05
    • 2021-12-26
    • 2019-08-08
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多