Rails按关联字段排序

时间:2013-10-27 09:38:33

标签: sql ruby-on-rails postgresql

我有以下型号

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,company对此表进行排序。 使用first_name,phone_number我没有任何问题,订单工作正常,例如

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

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

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

@user.user_extension.company

所以我有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

另外,我尝试使用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有问题,所有连接工作正常。

5 个答案:

答案 0 :(得分:88)

试试这个:

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

我认为您需要orderuser_extensions,而不是user_extension

答案 1 :(得分:13)

合并可以使查询变得更小/看起来更漂亮,并且在Rails 4.x中对我的基准测试更快:

@users = User.joins(:user_extension).merge(UserExtension.order(company: :desc))

答案 2 :(得分:11)

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

答案 3 :(得分:2)

旧主题,也许没有主题,但是我需要这个。 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')

答案 4 :(得分:1)

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

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

上面的代码应该放在 user model 中。

希望能帮到你! ?