带有关于has_one关联的Rails 3.2.11中的订单的范围

时间:2013-01-21 14:52:08

标签: sql ruby-on-rails postgresql

在我的Rails 3.2.11应用程序中,我有一个范围,我正在尝试根据相关属性进行排序。在我的例子中,我有一个用户模型和一个配置文件模型。用户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?

正确设置此范围的顺序

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

最终工作的结果是上述两个答案的组合:

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

按照我的希望进行排序。