0

関連するモデルがいくつかあります。

Company has_many :clients (which belongs_to :company)  
Client has_many :groups (which belongs_to :client)
Group has_many :orders (which belongs_to :group, :counter_cache => true)

今、私はすべての会社を見つけて、それらを注文順に並べ替える必要があります。私はgroupsorders_count列を持っているので、groups.orders_countで注文できると確信しています。次に、会社を繰り返し処理して、注文の合計を並べて表示する必要があります。

私はこれを見つけるために考え出そうとしてきました。私はMySQLデータベースを持っています、それがfind_by_sqlか何かに帰着するなら。

companies = Company.find(
  :all,
  :include => { :clients => :groups },
  :select => "companies.*, groups.orders_count",
  :group => "companies.id",
  :order => "groups.orders_count"
)

どんな助けや正しい方向へのプッシュもありがたいです!ありがとう。

4

2 に答える 2

0

使用groups.orders_countが問題になる可能性があります。会社に2つのクライアントがあり、各クライアントに1つのグループがある場合、どのgroup.orders_countで並べ替えますか?私が間違っている場合は私を訂正してください。

これはcounter_cacheを利用しませんが、機能するはずです(私のRails 2.xは少し錆びています):

companies = Company.all(
  :select => "companies.*",
  :include => { :clients =>  [ :groups => :orders ] },
  :group => "companies.id",
  :order => "count(orders.*) DESC")
于 2012-09-12T19:19:22.933 に答える
0

さて、これは私が理解するのに時間がかかりすぎました。SQLに関する本をできるだけ早く手に入れる必要があります。とにかく、これは私が欲しかったものでした:

sql = "groups.created_at BETWEEN :start_date AND :end_date"
options = { :start_date => 1.month.ago, :end_date => Date.today }

@companies = Company.all(
  :select => 'companies.*, count(orders.id) as counter',
  :joins => { :clients => { :groups => :orders } },
  :group => 'companies.id',
  :order => 'counter DESC',
  :conditions => [sql, options]
)

:joinsは、会社のcolumn_nameとしてカウンターを機能させます。なぜ:includesはそうではないのか、私にはわかりません。誰かが良い答えを持っているなら、私はその理由を学びたいと思います。だから私は書くことができます:

@companies.first.counter

そして、その会社の注文の総数を取り戻します。

編集

日付範囲にグループ/注文がないクライアントを除いて、ほぼ希望の結果が得られていることがわかりました。すべての結果には、カウンター用に少なくとも1つありました。

Railsの結合はINNERJOINを使用していることに気づきました。LEFT JOINは、対応する子を持たないオブジェクトを返します。だから私はこれに変更しました:

@companies = Company.all(
  :select => 'companies.*, count(orders.id) as counter',
  :joins => "LEFT JOIN clients ON clients.company_id = companies.id
    LEFT JOIN groups ON groups.client_id = clients.id LEFT JOIN orders ON orders.group_id = groups.id",
  :group => 'companies.id',
  :order => order_by,
  :conditions => [sql, options]
)

また、:includesには熱心な負荷が含まれていることも覚えています(必ずしも結合を行う必要はありません)。これが、おそらくそれを使用できなかった理由です。これはRails3では異なる場合があります。ここを参照してください:Rails:includeと:joins

于 2012-09-13T00:38:31.673 に答える