我在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
我在这里要做的是获取用户拥有的每家餐厅提供的所有食物中的所有成分。 ingredients_for_user变量表示我希望运行的Arel查询。我只是不确定如何运行&返回所有成分,并且Ingredient.find_by_sql ...似乎不正确。
端
答案 0 :(得分:-1)
我不明白为什么你不会这样做。 。 。
Ingredient.joins({:meals=>:restaurants}).
where(["restaurants.user_id = ?",self.id])
答案 1 :(得分:-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's README,这可能有助于您更好地理解。
答案 2 :(得分:-2)
返回对象的方法(如get_all_ingredients
方法)应该是类方法。在Ruby中如何做到这一点并不是100%明显,但一种方法是在声明方法时使用self.
前缀。 (当你深入研究Rubyists经常称之为self.
的东西时,这个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 %>