2016-03-22 11 views
0

多くの結合でアクティブレコードを使用して選択を行いました。これにより重複した値が発生しました。 を選択した後には、という別の関数の値が:idになります。しかし、それは動作しませんでした!もちろんActiveRecordの区別が機能しない

def join_query 
    <<-SQL 
    LEFT JOIN orders on orders.purchase_id = purchases.id 
    LEFT JOIN products on products.id = orders.complete_product_id 
    SQL 
end 

def select_query 
    <<-SQL 
    purchases.*, 
    products.reference_code as products_reference_code 
    SQL 
end 

result = Purchase.joins(join_query) 
       .select(select_query) 
       .distinct(:id) 

、どちら明確な:

は、ここでは、コードです!またはuniq関数が機能しました。 は別です!は、「ActiveRecord :: ImmutableRelation」のエラーを返しました。私はそれが何を意味するのかわかりません。

これを解決するには、ActiveRecord_Relationオブジェクトを配列に変換するハックを行い、Rubyの関数をユニークにしました。

ここでは何が起こっていますか?

+0

'ImmutableRelation'はActiveRecordのは、(http://api.rubyonrails.org/classes/ActiveRecord/ImmutableRelation.html)[すでにクエリをフェッチしている]ことを意味します。最後に 'join 'を入れてみてください。 – sjagr

+0

あなたはどのRDBMSを使用していますか? '.distinct(:id)'を使わないとあなたは何を見ますか?フェッチされたレコードを選択しようとしているので、 '.distinct(:id)'の使用が問題であるとは思わない。 –

答えて

0

はこれを試してみる:

def select_query 
    <<-SQL 
    DISTINCT ON (purchases.id) purchases.id, 
    products.reference_code as products_reference_code 
    SQL 
end 

add more comma separated column names in select clause 

Purchase.select(select_query).joins(join_query) 
関連する問題