質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

3089閲覧

ruby on rails 購入履歴ページの実装 2つ同時に購入した場合

tomato185

総合スコア29

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/09/16 12:45

実現したいこと

ECサイトの構築を現在行っており、購入履歴画面を作成しております。
下記ordersテーブルのようにAさん(user_id=1)は一度の買い物で2つの商品を買うケースも想定しております。
1度に2つ以上の商品を購入する場合、viewには2つまとめて表示させたい(Amazonなどでよく見られるケース)です。

###困っていること
addressesテーブルからログイン中ユーザーのレコードを抽出し、each文で回し、さらにもう一度eachメソッドを使って表示させようとも
考えましたが、だめでした。
ordersテーブルのuser_idを使用しても1つずつしか取り出せませんでした。

###DB
####ordersテーブル
|id|product_id|user_id|address_id|quantity|
|:--|:--:|--:|
|1|3|1|5|2
|2|4|1|5|3
|3|8|2|6|1

###コード

(show.html.erb) <div class="history"> <div calss="cart_area" style="width: 70%; margin-left: 5rem;"> <% @addresses_id.each do |order| %> <% address_id.each do |order| %> <% product = Product.find_by(id: order.product_id) %> <div class="card mb-3 hover" style="max-width: 840px; margin-bottom:3rem;"> <div class="row no-gutters"> <div class="col-md-4"> <% images= Image.find_by(product_id: order.product_id) %> <%= image_tag "#{images.name1}", alt: "#{Product.find_by(id: order.product_id).name}", class:"card-img" %> </div> <div class="col-md-8"> <div class="card-body"> <h5 class="card-title"><%= product.name %><%= l order.created_at, format: :for_result %></h5> <p class="card-text"> <p class="text-muted" style="font-size: 2rem;"><%= product.price %><span style="font-size: 1.5rem"> 円/個</span></p> <% if product.category == "running_shoes" %> <p class="text-muted">サイズ:<%= cart_item.size%></p> <% end %> <p class="text-muted"><%= order.quantity%>個</p> <p style="margin-top:2rem;">小計:<%= product.price * order.quantity %> 円</p> </p> </div> </div> </div> </div> <% end %> <% end %> </div>
users_controlller.rb def show @user = User.find(params[:id]) addresses = Address.where(user_id: current_user) @addresses_id = addresses.ids end

###補足情報(FW/ツールのバージョンなど)
ruby 2.6.6
rails '~> 5.2.4', '>= 5.2.4.3'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分だったら、中間テーブルを作って、関連で取得する方法で実装しますね

orders テーブル

iduser_idaddress_id
115
226

order_products テーブル

idorder_idproduct_idquantity
1132
2143
3281

投稿2020/09/16 12:56

necocoa

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomato185

2020/09/16 13:02

necocoa様 ご回答ありがとうございます。 あ、なるほど! ordersテーブルのuser_id探し、order_productsテーブルで得られたorder_idからeachメソッドを使用して一つずつ取り出すという認識でよろしかったでしょうか。
necocoa

2020/09/16 13:08

その方法でも出来なくはないですが、RailsやRDBMSをうまく使ってもっと簡単に取得できる方法があります。 こちらの記事を一通りやってみて、関連付け(アソシエーション)の理解をすると良いと思います。 https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1 関連を理解したら中間テーブルの意味なども理解できると思います。 その際にまたご質問ください。
tomato185

2020/09/16 13:11

オススメの記事を紹介してくださり大変感謝しております。 ありがとうございます!
tomato185

2020/09/16 13:33

has many throughを使うのですね! 初めて知りました!とても簡単に取り出せますね!! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問