так что я понимаю из вашего вопроса, что вы хотите получить результаты, такие как: Peppered Lettuce, 5 tbsp pepper, 10 oz Lettuce
, в котором Peppered Lettuce имеет Recipe
имя, а Pepper и Lettuce являются Food
элементами с числовым количеством ингредиентов.
Вам не нужны 4 таблицы для получения этого результата.Вам нужны только 3. Food
, Recipe
и промежуточная таблица для их связи «многие ко многим».
Recipe
может содержать несколько элементов Food
и 1 Food
Элемент может быть частью нескольких Recipe
объектов.Таким образом, модель Food
и Recipe
будет иметь ассоциацию many-to-many
.И для такого рода ассоциации вам нужен еще один стол.Вы можете назвать это Foods_Recipes
или просто Ingredients
.
Ваша модель Ingredient
будет иметь food_id
, recipe_id
, numeric_quantity
и unit_type
Схема будет выглядетькак это:
create_table "foods", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "ingredients", force: :cascade do |t|
t.bigint "recipe_id"
t.bigint "food_id"
t.decimal "quantity"
t.string "unit_type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["food_id"], name: "index_ingredients_on_food_id"
t.index ["recipe_id"], name: "index_ingredients_on_recipe_id"
end
create_table "recipes", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
end
Ваши модели будут выглядеть так: Модель еды:
class Recipe < ApplicationRecord
has_many :ingredients
has_many :foods,through: :ingredients
end
Модель ингредиента:
class Ingredient < ApplicationRecord
belongs_to :recipe
belongs_to :food
end
Модель еды:
class Food < ApplicationRecord
has_many :ingredients
has_many :recipes,through: :ingredients
end