web-dev-qa-db-fra.com

Rails ordre par champ d'association

J'ai les modèles suivants

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

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

J'ai une table qui contient tous les utilisateurs. Et je dois trier ce tableau par prénom, numéro de téléphone, société. Avec first_name, phone_number, je n'ai aucun problème, la commande fonctionne bien, par exemple

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

, mais j'ai aussi besoin de trier par entreprise et je ne sais pas comment le faire.

Et je peux obtenir le nom de l'entreprise de cette façon

@user.user_extension.company

J'ai donc des problèmes avec sql, ce qui me donnera tous les utilisateurs commandés par la société. DB: PostgreSQL. Merci.

Modifier:

Je devrais fournir plus d'informations sur ces modèles.

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

J'ai aussi essayé d'utiliser join

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

et ce que je reçois

 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

sur

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

je reçois aussi

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

Résolu J'ai des problèmes avec mon bd, toutes les jointures fonctionnent bien.

42
wendigooor

Essaye ça:

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

Je pense que vous avez besoin de order: user_extensions, ne pas user_extension

90
user2503775

La fusion peut rendre la requête plus petite/plus saine, et elle s'est comparée plus rapidement pour moi dans Rails 4.x:

@users = User.joins(:user_extension).merge(UserExtension.order(company: :desc))
13
Gary S. Weaver

@users = User.order("user_extension.company desc") devrait fonctionner correctement.

11
roganartu