2012-01-22 13 views
1

ActiveRecordを使い始める前に、特定のクエリを実行する方法を理解してください。材料のリストを入力し、それらの材料をレシピにマッチさせることと同等のものです。良いスキーマはどのように見え、このようなことがどうなるでしょうか?このactiverecordクエリを作成/最適化する方法は?

UPDATE:

私はこれまでのところ私はhas_and_belongs_to_manyアソシエーションの関係で結ばれた2つのモデル - 食材とレシピを持って、それをやっているので、どのように。私は説明した出力を得るために次のコードを使用していますが、あまりにも迂回しすぎているようです。誰かが単一のクエリでこれを最適化/取得する方法について何らかの洞察を提供できれば、素晴らしいものになるでしょう。

recipes = [] 
ingredients = ['i2', 'i1'] 
Recipe.uniq.joins(:ingredients).where("ingredients.name in (?)", ingredients).each do |recipe| 
    included_ingredients = recipe.ingredients.take_while { |i| ingredients.include?(i.name) } 
    recipes << recipe if recipe.ingredients.size == included_ingredients.size 
end 

答えて

1

良いスキーマは次のようになります

  1. recipe(recipe_id、recipe_name、等)
  2. ingredient(ingredient_id、ingredient_name、等)
  3. ingredients_recipes(recipe_id、成分番号)

ingredients_recipes w ouldは接続テーブルです。


このような何かはトリックを行う必要があります。

ingredients_recipes.joins(:recipe, :ingredient).where("ingredients_name = (?)", params[:ingredients]) 

これは、すべてのテーブルを結合し、配列で指定された成分のリストについては、します。


詳細については、THISを確認してください。

+0

マイナーポイント:*テーブル*は小文字(「レシピ」など)で、モデルは大文字と単数(「レシピ」など)です。また、結合表はアルファベット順であるため、デフォルトは 'ingredients_recipes'です。 – nickgrim

+0

@nickgrimの変更が加えられました。 –

+0

実行中: 'IngredientsRecipes.joins(:recipe、:ingredients).where(" ingredients.name =? "、['i2'、 'i1'])allはエラーです(ただし、配列と単なる一意の名前です)。エラー:ActiveRecord :: StatementInvalid:PGError:ERROR:WHEREの型はブール型でなければならず、レコードは入力しないでください –

関連する問題