Как написать / оптимизировать этот запрос activerecord? - PullRequest
1 голос
/ 22 января 2012

Просто начинаю работать с ActiveRecord и пытаюсь понять, как мне поступить с определенным запросом.Это было бы эквивалентно вводу списка ингредиентов и сопоставлению их с рецептами, которые эти ингредиенты позволят вам сделать.Как будет выглядеть хорошая схема и как это будет сделано?

ОБНОВЛЕНИЕ:

Итак, как я это делаю, у меня есть две модели- ингредиенты и рецепты, которые связаны отношением has_and_belongs_to_many.Я использую следующий код, чтобы получить вывод, который я описал, но он кажется слишком окольным.Если бы кто-нибудь мог предоставить какую-либо информацию о том, как оптимизировать / получить это в одном запросе, было бы здорово.

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 голос
/ 24 января 2012

Хорошей схемой будет:

  1. Таблица recipe (recipe_id, recipe_name и т.*
  2. Таблица ingredients_recipes (recipe_id, component_id)

Таблица ingredients_recipes будет соединительной таблицей.


Что-то подобное должно сработать:

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

Это объединит все таблицы и список ингредиентов, указанных в массиве.


Для получения дополнительной информации проверьте ЭТО .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...