2017-05-21 7 views
0

ActiveRecordウィザードを使用すると、AR命令でこのようなクエリを実行できるかどうかを判断できます。つまり、未処理のSQLを実行したり、Arelにダイビングしたりする必要はありませんか?ActiveRecord表記法に複雑なSQL postgresクエリ?

私は近くになっていますが、サブクエリを追加する方法を理解できないようです。私はRails 5.1.1です。

SELECT s.id as stock_id, s.count, adjustments.count as 
adjustment_count, adjustments.reason as adjustment_reason 
FROM 
(SELECT * FROM stocks WHERE inventory_id = 6) AS s 
LEFT JOIN adjustments 
ON (s.id = adjustments.stock_id AND adjustments.reason='run_use') 

最後の結果は、インベントリIDが6の在庫でなければなりません。私はActiveRecordを経由して取得しようとしているものです

私はNavicatはでRAW SQLを実行した場合、私はこの結果を取得するには、:enter image description here

これは私が近づいたが、それはただstock_ids 11と10を生成します。

Stock.where(inventory:6) 
.left_joins(:adjustments) 
.where("adjustments.reason = 'run_use'") 
+1

これまでに試したことと何が効いていないのかを投稿した方が役に立ちます。それ以外の場合は、ActiveRecordとRaw SQLの両方でウィザードを使用して、手助けしようとする必要があります。 – jvillian

+0

良い点! ARの声明で私の答えを編集しました。どのようにして生のSQLから "副問い合わせ"部分を含めるかに関する考え方、 "(SELECT * FROM株WHERE inventory_id = 6)AS available_stock"部分? – PDD

+0

また、選択しようとしていることを明白に英語で述べるべきでしょう。それはちょっと混乱します。 – jvillian

答えて

0

一つから

Stock. 
    where(inventory_id: 6). 
    joins(:adjustments). 
    where(adjustments: { reason: 'run_use' }) 

Stock.eager_load(:adjustments) 
    .where("adjustments.reason = ? OR stocks.inventory_id = ?", "run_use", 6) 

または

Stock.eager_load(:adjustments) 
    .where(adjustments: { reason: "run_use" }, inventory_id = 6) 
+0

うわー、これはすごいですし、とてもシンプルです。明らかにeager_loadを読み上げる必要があります。最初のステートメントは正しいです、それは3つを引っ張ります。 2つ目のオプションは、私が作っていた他の試みと同じように、2を引くだけです。お手伝いありがとう! – PDD

+0

最初はそのサブクエリが必要ないのでシンプルです。 '.to_sql'を追加して、生成している生のSQLを確認してください。 – Bartosz

+0

ちょうどeager_loadを読んで、私が左の結合部分をやっているのを見ました。上記の私のスクリーンショットのように、「adjustments.count as adjustment_count、adjustments.reason as adjustment_reason」というクエリ結果にAdjustmentsのフィールドを含める方法はありますか?ありがとう – PDD

0

hm。

は私にも「を実行使用」の理由と調整を持っているID = 6とインベントリに所属するすべての株式を与える:あなたが言うしようとしているようです。

どのようなものについて:あなたのために働く必要がありますこれらのGuides

+0

それは私のARステートメントで持っているよりも優れた表記法ですが、依然としてサブクエリを因数分解してinventory_id LEFTテーブル(株)の6。私が得ているのは、2つの調整ですが、調整をしていない1つの株がありません。私はこれを正しく説明していますが、今日はそんなに凝視しています... :)あなたの質問に答えるために...私は在庫ID = 6に属するすべての株式を取得しようとしています。 。 – PDD