从rails 3升级到rails 4时,has_many关联的顺序错误

时间:2013-10-31 15:30:21

标签: ruby postgresql ruby-on-rails-4 sql-order-by has-many-through

我正在尝试将一个项目从Rails 3更新到Rails 4.在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代码。

感谢任何帮助, 谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

tint_types关联更改为

has_many :tint_types, -> { reorder('value').uniq }, :through => :tint_codes