выглядит нормально для меня, как схема / подход.Я думаю, это может показаться уродливым, потому что выбор имени класса приводит к тому, что вы часто набираете "recipe.recipe_ingredients.ingredient".Для меня «ингредиент» - это пища / жидкость / все, что ЕГО ИСПОЛЬЗУЕТСЯ В РЕЦЕПТЕ, поэтому таблица соединений должна называться «ингредиенты».Каждый ингредиент имеет количество и ссылки на «продукт», «товар» или что-то подобное.
Я бы переименовал его так:
Recipe
has_many :ingredients
has_many :items, :through => :ingredients
Ingredient
#fields - recipe_id, item_id, quantity(string)
belongs_to :recipe
belongs_to :item
Item
has_many :ingredients
has_many :recipes, :through => :ingredients
Теперь на странице просмотра вы можете сказать
<h2><%= recipe.name %></h2>
<dl>
<% @recipe.ingredients.each do |ingredient| %>
<dt><%= ingredient.item.name %></dt>
<dd><%= ingredient.quantity %></dd>
<% end %>
</dl>