0

私は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">.

これは、'Test Drawing' の T が大文字であるためと思われます。「test Drawing」に変更すると、テストに合格します。

default_scope order大文字と小文字を区別しない方法はありますか?

4

1 に答える 1

4

デフォルトのスコープを変更して、小文字のタイトルで並べ替えることができます。

default_scope order: 'lower(title)'

または、怒鳴るのが好きな場合は、代わりに大文字を使用できます。

default_scope order: 'upper(title)'

これは、使用しているデータベースやその構成設定に関係なく、ほとんど同じように機能するはずです (もちろん、データベースが興味深い照合規則を使用するように構成されていない限り)。

この既定のスコープが結合に含まれることが予想される場合は、テーブル名を含めることをお勧めします。

于 2012-08-21T03:04:54.533 に答える