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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

2回答

464閲覧


カレントユーザーが投稿した音楽ではなくかつ音楽購入している場合に「SOLD OUT」を表示する。

sia_yuki_f717

総合スコア1

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/01/22 15:01

編集2022/01/24 07:24

■解決したいこと
Ordersテーブルより任意のuser_idを取得する。
カレントユーザーが投稿した音楽ではなくかつ音楽購入している場合は「SOLD OUT」を表示する。

■仮説と検証作業の結果
カレントユーザーが投稿した音楽の場合は金額を表示。(できている)

カレントユーザーが投稿した音楽ではなくかつ音楽を購入していない場合は
購入ページへのリンクになっている金額を表示。(できている)

Ordersテーブルのレコードにアクセスできていない。
musicsControllerにOrdersテーブルからレコードを取得する記述ができていない

ruby

1@order = Order.new(order_params) 2 3def order_params 4 params.permit(:user_id, :music_id).merge(user_id: current_user.id, music_id: params[:music_id]) 5 end


この記述だとテーブルの中身ではなくカレントユーザーIDのみが取得できている状態にあり、
@order.music_idを見るとわかるように
music_idの値もnilのままである。

ruby
 

<musicsController>

1def index 2 @order = Order.new(order_params) 3 @musics = Music.includes(:user).order('created_at DESC') 4 query = 'SELECT * FROM musics' 5 # @musics = Music.find_by_sql(query) 6 end 7 8private 9 10 def order_params 11 params.permit(:user_id, :music_id).merge(user_id: current_user.id, music_id: params[:music_id]) 12 end

html <music/index>

1<div class="info_show4"> 2 <% if user_signed_in? && current_user.id != music.user_id %> 3 <% if user_signed_in? && music.id == @order.music_id %> 4 <%= @order.user_id %> 5 <% else %> 6 <%= link_to "¥#{music.price}", music_orders_path(music.id) %> 7 <% end %> 8 <% else %> 9 <%= "¥#{music.price}" %> 10 <% end %> 11 </div>

ruby
 <music.rb>

1class Music < ApplicationRecord 2 belongs_to :user 3 has_many :tracks, dependent: :destroy 4 has_many :comments, dependent: :destroy 5 has_many :favorites 6 has_many :order 7 has_one_attached :image 8 9 with_options presence: true do 10 validates :title, length: { maximum: 22 } 11 validates :image 12 validates :artist_name, length: { maximum: 22 } 13 validates :price, format: { with: /\A[0-9]+\z/ }, 14 numericality: { only_integer: true, greater_than_or_equal_to: 500, less_than_or_equal_to: 50_000 } 15 end 16 17 validates :cd_type_id, numericality: { other_than: 1 } 18 19 extend ActiveHash::Associations::ActiveRecordExtensions 20 belongs_to :cd_type 21 22 validate :image_content_type, if: :was_attached? 23 24 def image_content_type 25 extension = ['image/png', 'image/jpg', 'image/jpeg'] 26 errors.add(:image, 'の拡張子が間違っています') unless image.content_type.in?(extension) 27 end 28 29 def was_attached? 30 image.attached? 31 end 32 33 def favorited_by?(user) 34 favorites.where(user_id: user.id).exists? 35 end 36end

ruby <order.rb>

1class Order < ApplicationRecord 2 has_one_attached :image 3 attr_accessor :token 4 belongs_to :music 5 belongs_to :user 6 7 8 with_options presence: true do 9 validates :token 10 validates :music_id 11 validates :user_id 12 end 13end

ordersテーブル

https://gyazo.com/e44ce1f035a448db91a7bc9410af5818



musicテーブル
https://gyazo.com/4509c471019f6180145e6f639e34cd7a



ビュー
https://gyazo.com/6e15b1d6a8ca8c9b489530443a91b02a

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

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

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

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

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

guest

回答2

0

着信音は、携帯電話の所有者の個性やスタイルに影響を与える重要な要素の 1 つです。 音楽を購入する必要はありませんが Gratis Ringtones Samsung で携帯電話の着信音をお気に入りの音楽に簡単に変更できます。

投稿2024/03/18 09:16

toquecelular

総合スコア6

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

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

0

ベストアンサー

「Ordersテーブルのレコードにアクセスできていない。」
ではなく
「Ordersテーブルのレコードにアクセスしていない。」
ですね。
Musicテーブルにはアクセスしていますが

##追記
has_many :order は has_many :orders に直してください。
ここの単複型は重要です。

そうしてあれば、「ある music」 の orderは music.orders で全部取れます。
その orders の中に user_id が current_user のものがあるかどうか、で

<%= order.user_id %> と <%= link_to "¥#{music.price}", music_orders_path(music.id) %>

を切り分けてください。
order.user_id よりも current_userであることは与件ですから、current_user.id でよいのでは、と思いますが。

なお、
このままでは DB へのアクセスが多くなるとかありますが、まだそこを議論するレベルではないと思うので、まず動くものができてから、ですね

投稿2022/01/22 22:37

編集2022/01/24 09:34
winterboum

総合スコア23329

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

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

sia_yuki_f717

2022/01/22 22:58

ご回答ありがとうございます。 こちらどのような記述をすることでOrdersテーブルにアクセスすることができますでしょうか? お手数ですがご教示いただきたいです。 よろしくお願いします!
winterboum

2022/01/23 07:30

Oderからどういう条件で取り出すか、によります。 find, find_by, where を調べてください。 全部纏めてでしたら all でいけます。
sia_yuki_f717

2022/01/23 09:29 編集

musicsControllerのindexに @order = Order.find(params[:id]) @order = Order.find(params[:music_id]) @order = Order.find_by(:music_id music.id) @order = Order.where(:music_id music.id) @order = Order.find_by(:music_id params[:music_id]) @order = Order.where(:music_id params[:music_id]) などいろんな記述を記入しましたがやはりorderテーブルが取れませんでした💦 私の記述やメソッドの使い方が間違っているのでしょうか? music.idに対応するOrdersテーブルのmusic_idを取り出したいです。 何度も申し訳ございません。  ご教示いただきたいです。 よろしくお願いいたします。
winterboum

2022/01/23 10:27

???「music.idに対応するOrdersテーブルのmusic_idを取り出したいです。」 music.idに対応するOrdersテーブルのデータの music_id は music.id と同じですよ? どういう Order を取り出したいのですか?
sia_yuki_f717

2022/01/23 11:59

言葉足らず申し訳ございません。 下記のようにユーザーがログインしていてかつmusicsテーブルのidとordersテーブルのmusic_idが同じである場合 (ordersテーブルにあるのはもうすでに購入済みの音楽であり、カレントユーザーが特定の音楽を購入していたら)SOLDOUTと表示させるというのを実装したいと思っております。 <% if user_signed_in? && music.id == @order.music_id %> 現在のこの記述ではordersテーブルのmusic_idを取り出せておりません。 musicsControllerへの記述にテーブルにアクセスして任意のmusic_idを取得する記述を 記入しなければならないと仮定したのですが一向にordersテーブルのmusic_idが取り出せません。 どのように記述することでordersテーブルのmusic_idを取り出すことができますでしょうか? ,,,ruby <music/index> <div class="info_show4"> <% if user_signed_in? && current_user.id != music.user_id %> <% if user_signed_in? && music.id == @order.music_id %> <%= "SOLD OUT" %> <% else %> <%= link_to "¥#{music.price}", music_orders_path(music.id) %> <% end %> <% else %> <%= "¥#{music.price}" %> <% end %> </div> ```
winterboum

2022/01/23 20:58

まずmusicの一覧があって、 それに対する login user がした Order を あれば 取り出すということですか?
sia_yuki_f717

2022/01/24 04:29

そうです! ログインユーザーがorderしたmusic_idを取り出したいです!
winterboum

2022/01/24 05:14

MusicとOrderのmodelのcode載せて
sia_yuki_f717

2022/01/24 07:22 編集

ありがとうございます!フルで載せます よろしくお願いします。 <code> class Music < ApplicationRecord belongs_to :user has_many :tracks, dependent: :destroy has_many :comments, dependent: :destroy has_many :favorites has_many :order has_one_attached :image with_options presence: true do validates :title, length: { maximum: 22 } validates :image validates :artist_name, length: { maximum: 22 } validates :price, format: { with: /\A[0-9]+\z/ }, numericality: { only_integer: true, greater_than_or_equal_to: 500, less_than_or_equal_to: 50_000 } end validates :cd_type_id, numericality: { other_than: 1 } extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :cd_type validate :image_content_type, if: :was_attached? def image_content_type extension = ['image/png', 'image/jpg', 'image/jpeg'] errors.add(:image, 'の拡張子が間違っています') unless image.content_type.in?(extension) end def was_attached? image.attached? end def favorited_by?(user) favorites.where(user_id: user.id).exists? end end </code> ``` class Order < ApplicationRecord has_one_attached :image attr_accessor :token belongs_to :music belongs_to :user with_options presence: true do validates :token validates :music_id validates :user_id end end ```
winterboum

2022/01/24 06:44

読みにくい codeは質問欄偏執して<code>で書いて
sia_yuki_f717

2022/01/25 00:07

お疲れ様です! 購入したもののみSOLD OUTを表示することができました! 長きにわたり親身に回答くださいましてありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問