Ассоциации ActiveRecord, has_many_through

Я пытался уложить в голове эти ассоциации и столкнулся с небольшой загвоздкой. Приложение, над которым я работаю, на данный момент имеет 2 модели: Ingredient и Recipe. Логика каждого из них следующая:

Модель Ingredient содержит информацию о продуктах питания, такую ​​как название, оптовая цена и т. д. Модель Recipe содержит название рецепта, инструкцию по приготовлению и список ингредиентов (вместе с количеством, необходимым для рецепта).

Изучив некоторые вопросы здесь и просмотрев несколько рельсовых передач, я решил, что отношения has_many_through могут быть лучше для того, что я пытаюсь сделать, так как я хотел бы включить дополнительную информацию об ингредиенте в рецепт. (необходимая сумма).

Основываясь на моем ограниченном опыте в этой области, я хотел бы подойти к этому так:

class Recipe < ActiveRecord::Base
  has_many :ingredients_recipes
  has_many :ingredients, :through => :ingredients_recipes
end

class Ingredient_Recipe < ActiveRecord::Base
  belongs_to :ingredient
  belongs_to :recipe
end

class Ingredient < ActiveRecord::Base
  has_many :ingredients_recipes
  has_many :recipes, :through => :ingredients_recipes
end

Где таблица ингредиентов_рецептов будет иметь поля, подобные этому: recipe_id, ингридиент_ид, ингридиент_количество (для хранения того, сколько определенного ингредиента находится в рецепте)

Это правильный подход к коду, основанный на функциональности, о которой я упоминал выше? Любая помощь будет принята с благодарностью. Спасибо!

Изменить Я также хотел бы иметь возможность добавлять эти новые ингредиенты в рецепт из формы рецепта. Потребуется ли для этого что-то дополнительное, например, выполнение accepts_nested_attributes_для сквозной таблицы, или Rails справится с этим самостоятельно?


person QMFNP    schedule 25.08.2012    source источник


Ответы (1)


Подход :has_many through работает лучше всего, когда один объект может иметь ноль или много других объектов, связанных &, есть некоторые свойства, связанные с каждым соединением.

Например, в вашем случае вы будете хранить количество каждого ингредиента вместе с recipe_id и inventory_id в таблице Connections.

Таким образом, это выглядит ХОРОШИМ для меня. :)

Однако вам следует подумать о том, чтобы назвать вашу таблицу Ingredient_Recipe более подходящей.

person Jatin Ganhotra    schedule 25.08.2012
comment
какое имя было бы более подходящим? - person Onichan; 10.09.2015