web-dev-qa-db-ja.com

Rails order by associationフィールド

私は次のモデルを持っています

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

また、結合を使用してみました

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に問題があり、すべての結合が正常に機能します。

42
wendigooor

これを試して:

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

orderuser_extensionsではなくuser_extensionで必要だと思います

90
user2503775

Mergeはクエリをより小さく/より見やすくすることができ、Rails 4.x:

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

@users = User.order("user_extension.company desc")は正常に動作するはずです。

11
roganartu