3

在我的 Rails 3.2.11 应用程序中,我有一个范围,我试图根据关联的属性对其进行排序。就我而言,我有一个 User 模型和一个 Profile 模型。用户 has_one 配置文件,我的范围位于配置文件表上的一个属性上。这是范围:

User.rb

def self.with_default_show
  joins(:profile).where("profiles.show_all = true")
end

然而,我遇到的麻烦是试图对此声明秩序。例如,运行:

joins(:profile).where("profiles.show_all = true").order("profiles.first_name DESC")

给我一个错误:

PG::Error: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list

我知道我可以做到.order("2"),但这会调用我的用户表中的第二列,而不是我的配置文件表。如何正确将此范围的顺序设置为profiles.first_name?

4

2 回答 2

2

ORDER BY 子句只能在应用了 DISTINCT 之后应用。

此外,您必须明确选择您订购的子句。

User.select('profiles.*, profiles.first_name')
       .joins(:profile)
       .where("profiles.show_all = true")
       .order("profiles.first_name DESC")

如上所示,为了让您的查询返回 Profile 属性,您还必须明确选择它们。

于 2013-01-21T15:11:27.760 回答
0

最终起作用的是上述两个答案的组合:

def self.with_default_show
  joins(:profile)
  .where(profiles: {show_all: true})
  .select('users.*, profiles.first_name')
  .order('profiles.first_name')
end

排序工作如我所愿。

于 2013-01-21T18:29:02.953 回答