【问题标题】:Case Insensitive default_scope :order?不区分大小写的 default_scope :顺序?
【发布时间】:2012-08-16 09:07:05
【问题描述】:

我有以下在mysql下通过的测试(使用FactoryGirl):

  test "order by title" do
    @library = create(:drawing_library, title: 'Accessories')
    @drawing = create(:drawing, drawing_library: @library, title: 'Test Drawing')
    create(:drawing, drawing_library: @library, title: 'z')
    create(:drawing, drawing_library: @library, title: 'm')
    create(:drawing, drawing_library: @library, title: 'b')

    str = ''
    @library.drawings.each do |dwg|
      str += dwg.title
    end

    assert_equal 'bmTest Drawingz', str
  end

绘图模型是:

class Drawing < ActiveRecord::Base
  belongs_to :drawing_library
  default_scope order: :title
  ..
end

在 postgresql 下,这个测试现在失败了:

<"bmTest Drawingz"> expected but was
<"Test Drawingbmz">.

这似乎是因为“测试绘图”中的 T 是大写的。如果我将其更改为“测试绘图”,则测试通过。

有没有办法让default_scope order 不区分大小写?

【问题讨论】:

  • 您可能还需要注意排序规则设置和语句选项。如果值在其他方面相同,某些排序规则只会将大小写用作决胜局。

标签: ruby-on-rails ruby postgresql activerecord rails-activerecord


【解决方案1】:

您可以将默认范围更改为按小写标题排序:

default_scope order: 'lower(title)'

或者,如果你喜欢大喊大叫,你可以改用大写:

default_scope order: 'upper(title)'

无论您使用哪个数据库或它具有哪些配置设置,这应该几乎相同(当然,除非您的数据库配置为使用有趣的排序规则)。

如果您希望此默认范围参与连接,则可能需要包含表名。

【讨论】:

  • 添加这样的功能会大大影响性能吗?
  • @croceldon:它不会免费提供,但我认为不会有很大的影响;除非你一直在做M.all,但如果你一直在加载整个表格,你会遇到比order by lower(title) 更大的问题。在 lower(title) 上添加索引可能会有所帮助,但您必须使用 Rails 来为计算值添加索引。
猜你喜欢
  • 2011-03-25
  • 2023-04-10
  • 1970-01-01
  • 2016-04-02
  • 2010-10-29
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多