2016-06-17 4 views
0

私はSELECT DISTINCTを使用しており、結果を関連値で注文しようとする際に問題があります。 (Railsの中で)この例を見てみましょう:関連する値で `has_many through、 - > {distinct} 'のレコードを注文する

私は明確なcustomers協会とCookモデルがあります:私は、彼らが複数の注文を持っている場合でも、一度顧客をカウントするため

has_many :customers, -> { distinct }, through: :orders, source: :user 

それは明確なのですが。

このため生成されたSQLは次のとおりです。

> cook.customers.to_sql 
=> "SELECT DISTINCT \"users\".* FROM \"users\" 
INNER JOIN \"orders\" ON \"users\".\"id\" = \"orders\".\"user_id\" 
INNER JOIN \"meals\" ON \"orders\".\"meal_id\" = \"meals\".\"id\" 
WHERE \"meals\".\"cook_id\" = 1" 

これは正常に動作します!私は注文それらの顧客のの最新created_at値によって顧客のリストを注文したい

orders表はmealsを通じて関連するが、無視して自由に感じるされます)。しかし、私はこれを行うとき、私はエラーを取得:

cook.customers.order('orders.created_at DESC').to_sql 
=> "SELECT DISTINCT \"users\".* FROM \"users\" 
    INNER JOIN \"orders\" ON \"users\".\"id\" = \"orders\".\"user_id\" 
    INNER JOIN \"meals\" ON \"orders\".\"meal_id\" = \"meals\".\"id  \"WHERE \"meals\".\"cook_id\" = 1 ORDER BY orders.created_at DESC" 
    > cook.customers.order('orders.created_at DESC') 
    ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 
    LINE 1: ...eals"."id" WHERE "meals"."cook_id" = $1 ORDER BY orders.cre... 

私は明示的に(私が原因has_many throughのに必要があるのはないと思う)テーブルを結合する場合であっても、これはまだ動作しません。

cook.customers.joins(:orders).order('orders.created_at DESC').to_sql 
=> "SELECT DISTINCT \"users\".* FROM \"users\" INNER JOIN \"orders\" \"orders_users\" ON \"orders_users\".\"user_id\" = \"users\".\"id\" INNER JOIN \"orders\" ON \"users\".\"id\" = \"orders\".\"user_id\" INNER JOIN \"meals\" ON \"orders\".\"meal_id\" = \"meals\".\"id\" WHERE \"meals\".\"cook_id\" = 1 ORDER BY orders.created_at DESC" 

手がかりはありますか?私はActiveRecordの関係を返すような解決策を探しています(sort_byを使用していないので)。これに追加のクエリを連鎖する予定です。

ありがとうございました:)

答えて

0

をあなたは私がこの cook.rb

class Cook < ActiveRecord::Base 
    has_many :orders 
    has_many :customers, through: :orders 
end 
cook = Cook.first 
Customer.joins(:orders).joins(:cooks).where('"orders_customers_join"."cook_id" = ?', saad.id).distinct.to_sql 

を使用して個別の顧客を得ることができ、これはあなたを与えるだろう、この has_many :customers, -> { distinct }, through: :orders, source: :user

のようにそれをしなければならないのはなぜ次の結果

"SELECT DISTINCT \"customers\".* FROM \"customers\" INNER JOIN \"orders\" ON \"orders\".\"customer_id\" = \"customers\".\"id\" INNER JOIN \"orders\" \"orders_customers_join\" ON \"orders_customers_join\".\"customer_id\" = \"customers\".\"id\" INNER JOIN \"cooks\" ON \"cooks\".\"id\" = \"orders_customers_join\".\"cook_id\" WHERE (\"orders_customers_join\".\"cook_id\" = 1)" 

これは私にすべての別個の顧客を与えるでしょう。

+0

私は 'Cook.first.customers'(または類似)を呼び出して、私のコントローラでの追加メソッドを呼び出すことなく、意図した結果を得ることができるようにしたいと思いますので、おかげで、これはしかし、それほど最適ではありません。 – djfdev

0

手動で結合条件を指定する必要はありません。includesを使用するとActiveRecordが結合条件を処理します。

cook.customers.includes(:orders).order('orders.created_at DESC').references(:orders).to_sql 
+0

これは実際に私が以前に得ていたのと同じエラーをもたらします: 'ActiveRecord :: StatementInvalid:PG :: InvalidColumnReference:ERROR:SELECT DISTINCT、ORDER BY式は選択リストに現れなければなりません。 – djfdev

関連する問題