Я изучаю Rails и работаю над примером приложения для отслеживания рецептов пива.
У меня есть модель под названием Рецепт, которая содержит название и эффективность рецепта.
У меня есть модель Ingredient, которая использует STI - она подразделяется на солод, хмель и дрожжи.
Наконец, чтобы связать рецепты и ингредиенты, я использую соединительную таблицу rec_items, которая содержит recipe_id, component_id и информацию, специфичную для этого рецепта / ингредиента, такую как количество и время варки.
Кажется, все работает хорошо - я могу найти все свои солоды, используя Malt.all, и все ингредиенты, используя Ingredient.all. Я могу найти ингредиенты рецепта, используя @ recipe.ingredients и т.д ...
Тем не менее, я сейчас работаю над представлением моего рецепта, и я не понимаю, как лучше всего выполнить следующее:
Я хочу отобразить название рецепта и связанную с ним информацию, а затем перечислить ингредиенты, но разделенные по типу ингредиента. Итак, если у меня эффективность Black IPA @ 85% и у меня 5 сортов солода и 3 сорта хмеля, результат будет примерно таким:
BLACK IPA (85%)
Ingredient List
MALTS:
malt 1
malt 2
...
HOPS:
hop 1
...
Теперь я могу вытащить @ recipe.rec_items и выполнить итерацию по ним, проверяя каждый rec_item.ingredient для типа == "Malt", а затем сделать то же самое для прыжков, но это не кажется ни Rails-y, ни эффективным , Так каков наилучший способ сделать это? Я могу использовать @ recipe.ingredients.all, чтобы вытащить все ингредиенты, но не могу использовать @ recipe.malts.all или @ recipe.hops.all, чтобы вытащить только эти типы.
Есть ли другой синтаксис, который я должен использовать? Должен ли я использовать @ recipe.ingredient.find_by_type ("Malt")? Делаете это в контроллере и передаете коллекцию в представление, или делаете это прямо в представлении? Нужно ли также указывать отношение has_many в моих моделях хмеля и солода?
Я могу заставить его работать так, как я хочу, используя условные операторы или find_by_type, но я делаю упор на этом "пути Rails" с минимальными издержками БД, насколько это возможно.
Спасибо за помощь!
Текущий код:
Recipe.rb
class Recipe < ActiveRecord::Base
has_many :rec_items
has_many :ingredients, :through => :rec_items
end
Ingredient.rb
class Ingredient < ActiveRecord::Base
has_many :rec_items
has_many :recipes, :through => :rec_items
end
Malt.rb
class Malt < Ingredient
end
Hop.rb
class Hop < Ingredient
end
RecItem.rb
class RecItem < ActiveRecord::Base
belongs_to :recipe
belongs_to :ingredient
end
recipes_controller.rb
class RecipesController < ApplicationController
def show
@recipe = Recipe.find(params[:id])
end
def index
@recipes = Recipe.all
end
end
Обновлено для добавления
Теперь я не могу получить доступ к атрибутам таблицы соединений, поэтому я отправил новый вопрос:
Rails - использование group_by и has_many: through и попытка доступа к атрибутам таблицы объединения
Если кто-то может помочь с этим, я был бы признателен !!