2017-02-03 3 views
0

私は、次のモデルていますのActiveRecord:範囲からの結果を注文しようとしてエラーが

class Master < ActiveRecord::Base 
    belongs_to :language 
    has_and_belongs_to_many :users 

    scope :with_users_count, -> do 
    joins('LEFT OUTER JOIN masters_users on masters_users.master_id = masters.id') 
     .select('masters.*, COUNT(masters_users.user_id) as users_count') 
     .group('masters.id') 
    end 
end 

私がやろうとしている:

Master.with_users_count.includes(:language).order('languages.name') 

を次のエラーが起こる:

ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "languages.id" must appear in the GROUP BY clause or be used in an aggregate function 

スコープを変更する方法をアドバイスしてください。このエラーはfですixed?

編集(追加情報):

  • 上記のコードは、結果にquotes_count「属性」を追加するためのものですので、私はN + 1ずに各マスターのためのユーザーの数を表示することができますし、カウンタキャッシュを必要とせずに(これはHABTMのためにバグが多いようです)。
  • スコープは正常に機能しますが、orderメソッドを呼び出すとエラーが表示されます。
  • 並べ替えはRansackの宝石によって行われるので、どのように処理されるかは制御できません。私はorderメソッドを、Ransack sort_linkでソートしようとしたときに起こるエラーを再現する方法として、より複雑な質問を避けるために使用しました。

ありがとうございます。

+0

は、ということが正しい、あなただけのcolumnularデータと一緒に、各マスタのユーザー数のカウントを取得しようとしているように見えますか? – coreyward

+0

coreyward:それは正しいです。各マスターのユーザー数を取得しようとするので、N + 1個のクエリを生成せずにインデックスビューを使用できます。追加情報を提供するために質問を編集しました。 – BrunoFacca

+1

さて、あなたはあなたの「命令」を完全に取り除くことができる/できないと思います。あなたが関係として 'languages'を読み込もうとしているからです。 'masters'を関連する' languages.name'でソートしたい場合は、別のjoinを使う必要があります。 Arelを使用するように変換すると、ASTはモデルで既に定義したリレーションシップとテーブル名をよりよく管理できます。 – coreyward

答えて

0

left_outer_joinにはスコープ内の言語も使用できます.SQLクエリに言語テーブルが追加されているため、注文中にエラーを取り除く必要があります。

scope :with_users_count, -> do 
joins('LEFT OUTER JOIN masters_users on masters_users.master_id = masters.id LEFT OUTER JOIN languages on languages.id = masters.language_id') 
    .select('masters.*, COUNT(masters_users.user_id) as users_count') 
    .group('masters.id') 

エンド

+0

あなたの答えをありがとう。私は受け入れられた答えとしてこれを選択できるように、いくつかのサンプルコードを提供してください。 – BrunoFacca

+0

サンプルコードが追加されました。試してみることができます。 –

+0

あなたより。残念ながら、あなたのコードを試して、次のエラーがあります:ActiveRecord :: StatementInvalid:PG :: GroupingError:エラー:列 "languages.name" GROUP BY句に表示するか、集計関数で使用する必要があります – BrunoFacca

関連する問題