5

Rails 3 から Rails 4 に 1 つのプロジェクトを更新しようとしています。Rails 3 では、次のことを行っていました。

class Sale < ActiveRecord::Base
  has_many :windows, :dependent => :destroy
  has_many :tint_codes, :through => :windows, :uniq => true, :order => 'code ASC'
  has_many :tint_types, :through => :tint_codes, :uniq => true, :order => 'value ASC'
end

sale.tint_types を呼び出すと、Rails 3 で次のクエリが実行されます。

SELECT DISTINCT "tint_types".* FROM "tint_types" INNER JOIN "tint_codes" ON "tint_types"."id" = "tint_codes"."tint_type_id" INNER JOIN "windows" ON "tint_codes"."id" = "windows"."tint_code_id" WHERE "windows"."sale_id" = 2 ORDER BY value ASC

次のようにRails 4用に更新しました:

class Sale < ActiveRecord::Base
  has_many :windows, :dependent => :destroy
  has_many :tint_codes, -> { order('code').uniq }, :through => :windows
  has_many :tint_types, -> { order('value').uniq }, :through => :tint_codes
end

クエリは次のように変更されます。

SELECT DISTINCT "tint_types".* FROM "tint_types" INNER JOIN "tint_codes" ON "tint_types"."id" = "tint_codes"."tint_type_id" INNER JOIN "windows" ON "tint_codes"."id" = "windows"."tint_code_id" WHERE "windows"."sale_id" = $1  ORDER BY value, code

order 句にコードを追加すると、PostgreSQL がエラーになります。スコープのせいだと思いますが、そのORDER BYコードを取り出す方法がわかりません。

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

4

Rails コミュニティは、私が解決策を見つけるのを助けてくれました。

class Sale < ActiveRecord::Base
  has_many :windows, :dependent => :destroy
  has_many :tint_codes, -> { order('code').uniq }, :through => :windows
  has_many :tint_types, -> { uniq }, :through => :tint_codes

  def tint_types
    super.reorder(nil).order(:width => :asc)
  end
end

詳細については、https://github.com/rails/rails/issues/12719を参照してください。

于 2013-10-31T20:40:09.077 に答える
1

tint_types関連付けを次のように変更します

has_many :tint_types, -> { reorder('value').uniq }, :through => :tint_codes
于 2013-10-31T15:46:29.327 に答える