Rails - использование group_by и has_many: through и попытка доступа к атрибутам таблицы соединений - PullRequest
0 голосов
/ 25 августа 2011

Для получения дополнительной информации, пожалуйста, см. Мой вопрос: Приложение Rails, использующее STI - самый простой способ получить эти записи?

У меня есть некоторые модели, объединенные с помощью отношения has_many через третью таблицу соединений (рецепт и ингредиент объединены через RecItem).

Так что ребята из предыдущего вопроса помогли мне сгруппировать ингредиенты моего рецепта по типу - это именно то, что я хотел. Однако теперь, когда я обращаюсь к @ recipe.ingredients вместо @ recipe.rec_items, я не могу вернуться к данным, хранящимся в таблице соединений rec_items (например, количество ингредиентов, продолжительность приготовления и т. Д.) )

До использования group_by я перебирал rec_items каждого рецепта примерно так:

<% @recipe.rec_items.each do |rec_item| %>
<%= rec_item.ingredient.name %><br />
<%= rec_item.amount %><br />
<% end -%>

Теперь, когда я группирую @ recipe.ingredients, как я могу вернуться к rec_items, связанным с этим рецептом? (Если я делаю ингредиент.rec_items, он дает мне rec_items для всех рецептов ... опять же, я могу сделать это с неуклюжими утверждениями, такими как:

ingredient.rec_items.find_by_recipe_id(@recipe.id).amount

но это кажется неправильным ...) Есть ли простой способ достичь этих целей? (получение списка ингредиентов конкретного рецепта, отсортированного / сгруппированного по: типу, при этом все еще имея возможность доступа к дополнительной информации в rec_items для каждой пары рецепт / ингредиент?)

Спасибо!

1 Ответ

4 голосов
/ 25 августа 2011

Публикация того же ответа снова, с небольшой модификацией:

Вы можете использовать group_by здесь.Кстати, лучше использовать includes в запросе рецепта, иначе будет много запросов.

recipe.rec_items.group_by {|ri| ri.ingredient.type}.each do |type, rec_items|
  puts type

  rec_items.each do |rec_item|
    puts rec_item.inspect
    puts rec_item.ingredient.inspect
  end
end
...