不区分大小写default_scope:顺序?

cro*_*don 0 ruby postgresql activerecord ruby-on-rails rails-activerecord

我在 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
Run Code Online (Sandbox Code Playgroud)

绘图模型为:

class Drawing < ActiveRecord::Base
  belongs_to :drawing_library
  default_scope order: :title
  ..
end
Run Code Online (Sandbox Code Playgroud)

在 postgresql 下,此测试现在失败并显示:

<"bmTest Drawingz"> expected but was
<"Test Drawingbmz">.
Run Code Online (Sandbox Code Playgroud)

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

有没有办法使default_scope order大小写不敏感?

mu *_*ort 5

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

default_scope order: 'lower(title)'
Run Code Online (Sandbox Code Playgroud)

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

default_scope order: 'upper(title)'
Run Code Online (Sandbox Code Playgroud)

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

如果您希望在连接中涉及此默认范围,您可能需要包含表名称。