2016-04-15 12 views
-2

私はどのようにwhere cause with the ActiveRecord findメソッドを使用することができますかと思います。.findを使用して.find

Supplier.joins(:products).find(params[:id]).where('suppliers.permalink = ? AND variants.master = ?', params[:id], TRUE) 

私に与えます:ここで

は、私が使用していたコードである

undefined method `where' for #<Supplier:0x007fe49b4eb330> 
IDを持つ最初のレコードを見つけることですあなたがここでやっている
+2

何?あなたはデータベースから何を得ようとしていますか? params [:id]は実際にはパーマリンクですか? – lcguida

答えて

1
Supplier.joins(:products).find(params[:id]).where('suppliers.permalink = ? AND variants.master = ?', params[:id], TRUE) 

params[:id]に含まれていて、その単一のレコードに対してwhere文を実行しようとしています。 whereは、モデル自体に対して実行する場合にのみ機能します。

ここで混乱する部分は、params[:id]を主キー(findはidフィールドを検索)に使用していますが、それをwhere句のpermalinkと比較しています。

両方の方法の使用方法を説明するために:

findあなたはidフィールドにそれを提供し、引数にマッチする、テーブルから結果(複数可)を検索します。複数のidを渡すことができます。このメソッドは、idによって、存在することが分かっている行を選択するために使用されます。最も一般的には、単一のidで使用され、単一のインスタンスを返します。

whereは、句に一致するテーブルからすべての結果を検索し、レコードのコレクションを返すために使用されます。その後、.firstを使用することにより、たとえば、これらの結果を絞り込むか、いずれかを選択できます。期待される結果である

Supplier.joins(:products).where('suppliers.permalink = ? AND variants.master = ?', params[:permalink], true).first 

(あなたがjoins(:products)を使用したが、その後variantsテーブルを照会していることに注意してください、これは正しくありません。?)

+0

私は以下の ' - @ supplier.variants.each do | item | =レンダリング:partial => 'product'、:locals => {:item => item} ' –

-1
Supplier.joins(:products).where('suppliers.permalink = ? AND variants.master = ?', params[:id], TRUE).find(params[:id]) 
+0

これは実際に私が期待していたSQLを返すものではありません。 'Suppliers.idとしてSuppliersを、prod_idとしてproducts.idを、products_nameにprod_nameを、product_types.nameにprod_typeをprod_typeとしてサプライヤ INNER JOIN variant_suppliers on variant_suppliers。 SUPPLIER_ID = suppliers.id インナーvariants.idに変異体をJOIN = variant_suppliers.variant_id INNERはproducts.id = variants.product_id インナーproduct_types.id = products.product_type_id WHERE suppliers.id(1)中にproduct_typesをJOINに製品をJOINとvariants.master = TRUE' –

+0

がfindを実行すると、結果セットが返され、クエリは返されません(whereを使用して取得したActive Relationオブジェクトに存在します)。 SQLが必要な場合は、whereを使用する必要があります。私はなぜ両方が必要なのか不思議です。 'find'で使用しているのと同じ条件で' where'を使うことができます。 –