3

私のRails 3.2.11アプリには、関連する属性に基づいて注文しようとしているスコープがあります。私の場合、User モデルと Profile モデルがあります。ユーザーには_one プロファイルがあり、スコープはプロファイル テーブルの属性にあります。範囲は次のとおりです。

User.rb

def self.with_default_show
  joins(:profile).where("profiles.show_all = true")
end

しかし、私が遭遇する問題は、その上で秩序を宣言しようとすることです。たとえば、次のように実行します。

joins(:profile).where("profiles.show_all = true").order("profiles.first_name DESC")

エラーが表示されます:

PG::Error: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list

できることはわかっています.order("2")が、これはプロファイル テーブルではなく、ユーザー テーブルの 2 番目の列を呼び出します。このスコープの順序をprofiles.first_nameで正しく設定するにはどうすればよいですか?

4

2 に答える 2

2

ORDER BY 句は、DISTINCT が適用された後にのみ適用できます。

また、注文する句を明示的に選択する必要があります。

User.select('profiles.*, profiles.first_name')
       .joins(:profile)
       .where("profiles.show_all = true")
       .order("profiles.first_name DESC")

上記のように、クエリでプロファイル属性を返すには、それらも明示的に選択する必要があります。

于 2013-01-21T15:11:27.760 に答える
0

最終的に機能したのは、上記の2つの答えの組み合わせでした。

def self.with_default_show
  joins(:profile)
  .where(profiles: {show_all: true})
  .select('users.*, profiles.first_name')
  .order('profiles.first_name')
end

思った通りに並べ替えができました。

于 2013-01-21T18:29:02.953 に答える