2016-08-01 11 views
1

は、私は私のレールのコンソールから次のクエリ当たっています:選択し、同じSQLクエリを打つレールではなく、異なる結果と摘み取る

Listing.joins(:colors, :sizes, :product, :orders).pluck('colors.id', 'sizes.id', 'products.id', 'orders.id') 
    (4.5ms) SELECT colors.id, sizes.id, products.id, orders.id FROM "listings" INNER JOIN "colors" ON "colors"."listing_id" = "listings"."id" INNER JOIN "sizes" ON "sizes"."listing_id" = "listings"."id" INNER JOIN "products" ON "products"."id" = "listings"."product_id" INNER JOIN "orders" ON "orders"."listing_id" = "listings"."id" 

Listing.joins(:colors, :sizes, :product, :orders).select('colors.id', 'sizes.id', 'products.id', 'orders.id') 
    Listing Load (4.6ms) SELECT colors.id, sizes.id, products.id, orders.id FROM "listings" INNER JOIN "colors" ON "colors"."listing_id" = "listings"."id" INNER JOIN "sizes" ON "sizes"."listing_id" = "listings"."id" INNER JOIN "products" ON "products"."id" = "listings"."product_id" INNER JOIN "orders" ON "orders"."listing_id" = "listings"."id" 

をそれぞれ以下の結果を得た:

[[2, 3, 1, 1], [2, 3, 1, 2], [2, 2, 1, 1], [2, 2, 1, 2], [2, 1, 1, 1], [2, 1, 1, 2], [3, 3, 1, 1], [3, 3, 1, 2], [3, 2, 1, 1], [3, 2, 1, 2], [3, 1, 1, 1], [3, 1, 1, 2], [4, 3, 1, 1], [4, 3, 1, 2], [4, 2, 1, 1], [4, 2, 1, 2], [4, 1, 1, 1], [4, 1, 1, 2]] 

#<ActiveRecord::Relation [#<Listing id: 1>, #<Listing id: 2>, #<Listing id: 1>, #<Listing id: 2>, #<Listing id: 1>, #<Listing id: 2>, #<Listing id: 1>, #<Listing id: 2>, #<Listing id: 1>, #<Listing id: 2>, ...]> 

これは私には分かりにくいです。

+1

プラックは、この場合、アレイ、セレクトリターンオブジェクトを返す結果は、むしれのdoesn同じであるが、いくつかの掲載 –

答えて

0

あなたはpluckselectが提供する結果のフォーマットと混同されています。 pluck戻り値は単純配列です。ここでは、selectとして、アクティブレコードリレーションの配列を返します。そのため、異なるフォーマットと同じ結果が得られます。

あなたの疑いが解消されることを願っています。

pluckため

出力:

[[2, 3, 1, 1], [2, 3, 1, 2]..] 

出力select用:

#<ActiveRecord::Relation[#<Listing id: 1>, #<Listing id: 2>..] 
2

あなたはpluckとselectの使用を混同しています。

選択して、結果セットに必要なフィールドを指定します。しかし、ActiveRecordオブジェクトの配列として設定された一致する結果を返します。

#<ActiveRecord::Relation [#<Listing id: 1>, #<Listing id: 2>, ... 

摘むには同じことを行いに対し、すなわちそれは、指定された属性を持つ選択最初に実行されますが、代わりにそれが唯一の結果セットからそれらの属性値を駆り立てる、簡単な配列に入れActiveRecordのモデルを構築します。したがって、あなただけの代わりに、オブジェクトの配列の値の結果の配列を見ることができます:

[[2, 3, 1, 1], [2, 3, 1, 2], [2, 2, 1, 1], [2, 2, 1, 2],... 
+1

アクティブレコードオブジェクトを作成することはありません(実際には、その半分のポイントです)。 –

+0

@FrederickCheungあなたが正しいです、答えが更新されました。 –

関連する問題