UPDATE
Хорошо, я понял это. Мне пришлось назвать следующие для сортов:
<%=h @user.varieties.find_by_product_id(product.id).name %>
Вот мои два следующих вопроса:
(1) Это вызовет проблемы при редактировании / удалении записей, потому что я не вызываю модель соединения? Я видел несколько видео Райана Бейтса, где он подчеркивает этот момент, но у меня возникают проблемы при попытке сослаться на модель соединения здесь. Другими словами, должен ли вышеуказанный код вызываться через user_products
?
Если я использую следующий код, который ссылается на таблицу соединений, я смогу получить его только для отображения variety_id
из таблицы соединений (поскольку в таблице соединений нет столбца имени для разновидностей). Я не уверен, как заставить этот код ссылаться на variety_id
в таблице соединений, но затем перейти к таблице сортов, чтобы получить фактическое название сорта из столбца «имя».
<% @user.products.each do |product| %>
<% @user.user_products.find_by_product_id(product.id).variety_id %>
<% end %>
(2) Этот сложный материал правильно размещен в слое вида или есть лучший способ перенести его на модель или контроллер?
Спасибо.
Оригинальный вопрос ниже теперь решён ...
У меня есть следующие модели:
- пользователи
- продукты
- сорта
- user_products
Вот реальная версия того, что я пытаюсь сделать. Допустим, пользователь - это продуктовый магазин. Продукты фрукты, как яблоки. А сорта - это такие виды яблок, как фуджи и макинтош.
Мне нужно создать приложение, где:
Пользователь может добавить много типов товаров на свою страницу. Продукты могут включать несколько разновидностей, но пользователь НЕ обязан включать какие-либо разновидности. Например, продуктовый магазин Topps может добавить яблоки на свою страницу. Если это все, что они хотят показать, это должно быть хорошо. Тем не менее, они также могут добавить больше деталей, включая типы яблок, которые они несут, такие как fuji, mcintosh и т. Д. Сорт не может быть просто детальным продуктом. Другими словами, я не могу сделать каждый продукт чем-то вроде apple-fuji, apple-mcintosh. Они должны быть двумя отдельными моделями.
На странице пользователя (т. Е. В представлении «показать») мне нужно иметь возможность отображать как продукт, так и сорт (если есть). Система должна понимать, что сорта связаны с конкретным продуктом для данного конкретного пользователя.
После получения первого ответа я пересмотрел свои модели, как описано в ответе ниже. Каждый сорт принадлежит одному продукту, то есть fuji принадлежит только яблочному продукту, который является отдельным идентификатором в таблице продуктов. И продукт имеет много разновидностей, то есть яблочный продукт может иметь 5 или 10 разных разновидностей.
Однако все становится сложнее, потому что у каждого пользователя может быть свой набор комбинаций продуктов / сортов. Например, продуктовый магазин Topps (пользователь) может иметь яблоки (продукт), которые являются fuji и mcintosh (варианты). Но в продуктовом магазине Publix (пользователь) могут быть яблоки (продукт) красного вкуса и праздничные (сорта).
На странице пользователя я хочу иметь возможность вызывать каждый продукт, который несет пользователь, а затем отображать сорта, связанные с каждым из этих продуктов, если пользователь выбрал какие-либо сорта.
Когда я пробую код, указанный ниже в представлении show, я получаю следующую ошибку: неопределенный метод `user_product 'для #:
<% @user.products.each do |product| %>
<% @user.user_products.find_by_product_id(product.id).varieties %>
<% end %>
С другой стороны, когда я пробую другой вариант, который вы мне дали (перечислены ниже), страница загружается, и запрос sql кажется правильным в журнале, но на странице не отображаются варианты, что странно, потому что я трижды проверил и есть записи в базе данных, которые должны соответствовать запросу. Подробности ниже ...
<% @user.products.each do |product| %>
<% @user.varieties.find_by_product_id(product.id) %>
<% end %>
Этот код запускает следующий SQL-запрос:
User Load (0.7ms) SELECT * FROM "users" WHERE ("users"."id" = 2)
Variety Load (0.5ms) SELECT "varieties".* FROM "varieties" INNER JOIN "user_product" ON "varieties".id = "user_products".variety_id WHERE (("seasons".user_id = 2))
Визуализация шаблона в макетах / приложении
Рендеринг пользователей / шоу
Product Load (0.7ms) SELECT "products".* FROM "products" INNER JOIN "user_product" ON "products".id = "user_products".product_id WHERE (("user_products".user_id = 2))
Variety Load (0.4ms) SELECT "varieties".* FROM "varieties" INNER JOIN "user_product" ON "varieties".id = "user_products".variety_id WHERE ("varieties"."product_id" = 1) AND (("user_products".user_id = 2)) LIMIT 1
Variety Load (0.2ms) SELECT "varieties".* FROM "varieties" INNER JOIN "user_products" ON "varieties".id = "user_products".variety_id WHERE ("varieties"."product_id" = 2) AND (("user_products".user_id = 2)) LIMIT 1
В данном случае выше, пользователь, на которого я смотрю, - user_id=2, he does have product_id=1 and product_id=2 in the database. And, in the user_products table, I do have a few records that list this user_id connected to each of these product_ids and associated with some variety_ids.
Так что мне кажется, что я должен отображать некоторые результаты в моем представлении шоу, но я ничего не получаю.
Наконец, когда я пытаюсь сделать следующее:
<% @user.products.each do |product| %>
<%=h @user.user_products.find_by_product_id(product.id) %>
<% end %>
Он отображает следующее в моих представлениях для каждой записи: #<User_product:0x4211bb0>