62

我有以下型号

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

class UserExtension
  attr_accessible :company, :user_id
  belongs_to :user
end

我有包含所有用户的表。我需要按名字、电话号码、公司对这张表进行排序。使用 first_name,phone_number 我没有任何问题,订单工作正常,例如

@users = User.order("first_name desc")

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

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

@user.user_extension.company

所以我在使用 sql 时遇到了麻烦,这会给我公司订购的所有用户。数据库: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

另外,我尝试使用 join

User.joins(:user_extension).order("user_extension.company desc")

我得到了什么

 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

User.includes(:user_extension).order("user_extension.company desc")

我也得到

PG::Error: ERROR:  relation "user_extensions" does not exist

已解决 我的 bd 有问题,所有连接都可以正常工作。

4

5 回答 5

125

尝试这个:

@users = User.includes(:user_extension).order("user_extensions.company desc")

我认为您需要在order: user_extensions,而不是user_extension

于 2013-10-27T11:11:55.687 回答
22

合并可以使查询更小/看起来更清晰,并且它在 Rails 4.x 中对我来说更快:

@users = User.joins(:user_extension).merge(UserExtension.order(company: :desc))
于 2016-09-13T20:29:48.723 回答
12

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

于 2013-10-27T10:05:00.860 回答
4

老话题,也许离题,但我需要这个。FWIW:

按关联字段排序

User.includes(:user_extension).order('user_extensions.company ASC')

让它更有趣,创造更多的联想。

由协会订购两级深。

User.includes(user_extension: :company).order('companies.name ASC')

由协会订购三层深。

User.includes(user_extension: { company: :guilds }).order('guilds.secret_knock ASC')
于 2020-06-22T21:51:53.717 回答
1

也许为时已晚,但我遇到了类似的问题,这就是我实现它的方式:

scope :sort_by_company, ->{
    joins(:user_extension).order(UserExtension.arel_table[:company].lower.desc)
  }

上面的代码应该放在user model.

希望它可以帮助!

于 2020-12-29T13:32:23.667 回答