Rails按关联字段排序

wen*_*oor 44 sql postgresql ruby-on-rails

我有以下型号

class User
  attr_accesible :first_name, :phone_number
  has_one :user_extension
end

class UserExtension
  attr_accessible :company, :user_id
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我有包含所有用户的表.我需要通过first_name,phone_number,company对此表进行排序.使用first_name,phone_number我没有任何问题,例如,订单工作正常

@users = User.order("first_name desc")
Run Code Online (Sandbox Code Playgroud)

,但我也需要按公司排序,不知道该怎么做.

我可以通过这种方式获得公司名称

@user.user_extension.company
Run Code Online (Sandbox Code Playgroud)

所以我有sql的麻烦,这将给我所有用户订购的用户.DB:PostgreSQL.谢谢.

编辑:

我应该提供有关此模型的更多信息.

create_table "user_extensions", :force => true do |t|
  t.integer  "user_id"
  t.string   "company"
end

create_table "users", :force => true do |t|
  t.string   "first_name"
  t.string   "phone_number" 
end
Run Code Online (Sandbox Code Playgroud)

另外,我尝试使用join

User.joins(:user_extension).order("user_extension.company desc")
Run Code Online (Sandbox Code Playgroud)

而我得到了什么

 User Load (1.6ms)  SELECT "users".* FROM "users" INNER JOIN "user_extensions" ON "user_extensions"."user_id" = "users"."id" ORDER BY user_extension.company desc
PG::Error: ERROR:  relation "user_extensions" does not exist
Run Code Online (Sandbox Code Playgroud)

User.includes(:user_extension).order("user_extension.company desc")
Run Code Online (Sandbox Code Playgroud)

我也明白了

PG::Error: ERROR:  relation "user_extensions" does not exist
Run Code Online (Sandbox Code Playgroud)

已解决 我的bd有问题,所有连接工作正常.

use*_*775 94

试试这个:

@users = User.includes(:user_extension).order("user_extensions.company desc")
Run Code Online (Sandbox Code Playgroud)

我认为你需要order:user_extensions,不是user_extension

  • 确实.:user_extension是关联,"user_extensions"是表名,您需要在order子句中引用表名. (4认同)
  • 太好了!我有这个确切的问题! (2认同)
  • 大!现在,这在官方文档中记录了什么? (2认同)

Gar*_*ver 15

合并可以使查询更小/看起来更漂亮,并在Rails 4.x中为我更快地进行基准测试:

@users = User.joins(:user_extension).merge(UserExtension.order(company: :desc))
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:我们知道,作为 Rails 5.1.1,这会返回重复的用户,这在连接中很常见。但是,在最后应用 `.distinct` 会引发如下错误:`ERROR: for SELECT DISTINCT, ORDER BY 表达式必须出现在选择列表中`。 (3认同)

rog*_*rtu 12

@users = User.order("user_extension.company desc") 应该工作正常.

  • @Roganartu,只是好奇:是否存在关联的等效哈希语法(即,相当于`order(company :: desc)`? (3认同)
  • 怎么样的'User.includes(:user_extension).order("user_extension.company desc")`? (2认同)

oma*_*oma 10

老话题,也许是偏离主题的,但我需要这个。前言:

按关联字段排序

User.includes(:user_extension).order('user_extensions.company ASC')
Run Code Online (Sandbox Code Playgroud)

让我们让它变得更有趣,创造更多的关联。

协会的秩序深达两层。

User.includes(user_extension: :company).order('companies.name ASC')
Run Code Online (Sandbox Code Playgroud)

协会的秩序深达三级。

User.includes(user_extension: { company: :guilds }).order('guilds.secret_knock ASC')
Run Code Online (Sandbox Code Playgroud)