Rails:在使用PostgreSQL、DISTINCT和ORDER时将作用域封装在一起

Rails:在使用PostgreSQL、DISTINCT和ORDER时将作用域封装在一起,sql,ruby-on-rails,postgresql,activerecord,Sql,Ruby On Rails,Postgresql,Activerecord,我已经开始将Rails 4应用程序从SQLite迁移到PG(PostgreSQL)。我有很多用于排序的作用域(例如:scope:default_order,->{order(:name)}),我合并这些作用域以对控制器中的记录进行排序 对于PG,当我这样做时: User.joins(:shipments, :person).merge(Person.default_order).distinct 它抱怨说: ERROR: for SELECT DISTINCT, ORDER BY expr

我已经开始将Rails 4应用程序从SQLite迁移到PG(PostgreSQL)。我有很多用于排序的作用域(例如:scope:default_order,->{order(:name)}),我合并这些作用域以对控制器中的记录进行排序

对于PG,当我这样做时:

User.joins(:shipments, :person).merge(Person.default_order).distinct
它抱怨说:

 ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
我所有的作用域都被很好地封装了,但是现在,我似乎需要手动编写select子句(使用DISTINCT并深入模型以选择适当的排序列…如下面的答案:)。我听上去不太对

我已经尝试在排序范围中“添加”到select(以保持其封装,类似于:.select(arel_table[:weight]),但它不起作用

具有讽刺意味的是,我已经用Rails 3.2将所有手动选择(“DISTINCT…”)语句迁移到ActiveRecord.uniq,但看起来我需要在另一个方向上重新进行

除非有人有好的建议

PS:我现在看到的唯一解决办法是丑陋:

User.joins(:shipments, :person).merge(Person.default_order).select('DISTINCT(users.*), people.name')

我认为你无法逃脱PG的限制()。这仍然很难看,但提供了一种封装东西的方法:
User.select(“users.*).joins(:shippings,:person).merge(person.select(“people.name”).default_order).distinct
.cschroed,这没有帮助:因为order子句经常包含来自另一个表的列。我认为您无法逃脱PG限制()。这仍然很难看,但提供了一种封装东西的方法:
User.select(“users.*).joins(:shippings,:person)。merge(person.select(“people.name”)。default_order)。distinct
.cschroed,这没有帮助:因为order子句经常包含来自另一个表的列。