3

我在 Rails 3 上,我有一个 SQL 查询,由我在 Arel 中建立的几个连接组成。我想从我的一个模型中的方法运行此查询,但我不确定如何执行此操作。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

我在这里要做的是获取用户拥有的每家餐厅提供的所有餐点中使用的所有成分。成分_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

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 回答
-2

返回对象的方法(如您的get_all_ingredients方法)应该是类方法。在 Ruby 中如何做到这一点并不是 100% 显而易见的,但一种方法是self.在声明方法时使用前缀。(self.当您深入研究 Ruby 主义eigenclass者通常所说的 .

以下是您的方法在成分模型中的外观:

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 回答