我正在尝试将一个项目从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通过一个错误。我认为这是因为范围的原因,但我不知道如何通过代码来获取订单。
任何帮助都是感激的,谢谢!
发布于 2013-10-31 20:40:09
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。
https://stackoverflow.com/questions/19710639
复制相似问题