アップデート
わかりました。品種については、次のように呼び出す必要がありました。<%=h @user.varieties.find_by_product_id(product.id).name %>
ここに私の2つの質問があります:
(1) 結合モデルを呼び出していないため、レコードの編集/削除時に問題が発生しますか? Ryan Bates がこの点を強調しているビデオを見たことがありますが、ここで結合モデルを参照しようとしてもうまくいきません。言い換えれば、上記のコードは を介して呼び出す必要があります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
これが私がやろうとしていることの現実世界のバージョンです。User が食料品店だとしましょう。製品はリンゴのような果物です。そして品種は、フジやマッキントッシュなどのリンゴの種類です。
次のようなアプリを作成する必要があります。
ユーザーは自分のページに多くの種類の製品を追加できます。製品には複数の品種を含めることができますが、ユーザーは品種を含める必要はありません。たとえば、Topps Grocery Store はページにリンゴを追加できます。彼らが表示したいのはそれだけであれば、それで問題ありません。ただし、フジ、マッキントッシュなど、運ぶリンゴの種類を含めることで、さらに詳細を追加することもできます。品種は単なる詳細な製品ではありません。つまり、それぞれの商品をりんご - ふじ、りんご - マッキントッシュにすることはできません。それらは 2 つの別個のモデルである必要があります。
ユーザーのページ (つまり、「表示」ビュー) で、製品と品種 (存在する場合) の両方を表示できる必要があります。システムは、品種がこの特定のユーザーの特定の製品に関連付けられていることを理解する必要があります。
受け取った最初の回答に続いて、以下の回答で説明されているようにモデルを修正しました。各品種は 1 つの製品に属します。つまり、フジは製品テーブルの個別の ID であるリンゴ製品のみに属します。また、製品にはさまざまな種類があります。つまり、リンゴ製品には 5 つまたは 10 種類の異なる種類がある場合があります。
ただし、各ユーザーがさまざまな製品/品種の組み合わせを持っている可能性があるため、さらに複雑になります。たとえば、Topps 食料品店 (ユーザー) には、fuji と mcintosh (品種) のリンゴ (製品) があるとします。しかし、Publix の食料品店 (ユーザー) には、赤いおいしいリンゴ (製品) とガラ (品種) がある場合があります。
ユーザーページでは、ユーザーが持っている各製品を呼び出し、ユーザーが品種を選択した場合、それらの各製品に関連する品種を表示できるようにしたいと考えています。
以下に示すコードをショー ビューで実行しようとすると、次のエラーが表示されます: undefined method `user_product' for #:
<% @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>