3

Rails 3 を使用しており、Arel で作成したいくつかの結合で構成される SQL クエリがあります。モデルの 1 つのメソッドからこのクエリを実行したいのですが、その方法がわかりません。arel オブジェクトは Arel::InnerJoin 型であることが判明したため、そのクエリから返されたすべてのオブジェクトの配列を取得したいと考えています。そのために ModelName.find_by_sql(my_arel_query_object) を実行する必要がありますか? または、 my_arel_query_object.each {...} を実行し、各タプルを反復処理して、手動で配列にポップする必要がありますか?

私は自分自身を明確にしていることを願っています。どんな洞察も大歓迎です。ありがとう。

更新: ユーザー モデル内で使用するコードは次のとおりです。

def get_all_ingredients
    restaurants = Table(:restaurants)
    meals = Table(:meals)
    ingredients = Table(:ingredients)

    restaurants_for_user = restaurants.where(restaurants[:user_id].eq(self.id))
    meals_for_user = restaurants_for_user.join(meals).on(restaurants[:id].eq(meals[:restaurant_id]))  
    ingredients_for_user = meals_for_user.join(ingredients).on(meals[:id].eq(ingredients[:meal_id])) 

    return Ingredient.find_by_sql(ingredients_for_user.to_sql)
end

ここで私がしようとしているのは、ユーザーが所有する各レストランで提供されるすべての食事に使用されるすべての食材を取得することです。components_for_user 変数は、実行したい Arel クエリを表します。すべての成分を実行して返す方法がわかりません.Ingredient.find_by_sql ...は正しくないようです。

終わり

4

3 に答える 3

-1

なぜあなたが次のことをしないのか理解できません。. .

Ingredient.joins({:meals=>:restaurants}).
           where(["restaurants.user_id = ?",self.id])
于 2011-09-12T19:13:05.173 に答える
-2

オブジェクトを返すメソッド (get_all_ingredientsメソッドなど) は、クラス メソッドである必要があります。Ruby でこれを行う方法は 100% 明らかではありませんが、1 つの方法はself.、メソッドを宣言するときにプレフィックスを使用することです。(これself.は最終的に、Rubyist がしばしば と呼ぶものに飛び込むときに理にかなっていますeigenclassが、今のところ、それがどのように行われているかを知ることができます)。

Ingredients モデルでのメソッドは次のようになります。

def self.get_all_ingredients
    # insert your code from your question here
end

次に、次のようにビューでメソッドを呼び出します。

<%- Ingredients.get_all_ingredients.each do |current_ingredient| %>
# do your things here
<% end %>

于 2012-05-18T13:36:41.167 に答える
-2

Arel オブジェクト (より具体的にはArel::Relationオブジェクト) は、リレーショナル代数のクエリを表します。クエリは、その要素に初めてアクセスしようとしたときに実行され、以前と同様に結果セットとして機能します。

たとえば、次のようなクエリがある場合

users.join(:photos).on(users[:id].eq(photos[:user_id]))

ビュー内の写真を反復処理できます。

<% users.each do |user| %>
  <% users.photos.each do |photo| %>
    <%= photo.name %>
  <% end %>
<% end %>

この例は、Arel の READMEから取ったもので、理解を深めるのに役立つかもしれません。

于 2010-08-08T04:02:03.410 に答える