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

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

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

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

Q&A

1回答

560閲覧

1対多のリレーションがうまくいきません。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 6

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

0グッド

0クリップ

投稿2020/06/07 07:05

現在、4択問題の機能を実装しています。
その中で、ユーザーが一度正解したら、その後はデータベースに反映されないようにしたいです。

考えた方法としては、
user_idとquiz_idがrankingsモデルに存在している場合→データベースに保存しない
それ以外→データベースに保存する

としたいのですが、そもそもその実装に必要なquiz_idカラムがうまく反映させられません。

クイズモデルとランキングモデルは、1対多の関係で関連性を持たせています。(カラム名も規約通り、quiz_idとしています。)

class Quiz < ApplicationRecord has_many :rankings, dependent: :destroy
class Ranking < ApplicationRecord belongs_to :quiz
RankingsDatabase id|correct|user_id|created_at|updated_at|total_correct|quiz_id 1|1|101|2020-06-07 06:02:24.215425|2020-06-07 06:02:24.215425|0|1 2|1|101|2020-06-07 06:02:28.924287|2020-06-07 06:02:28.924287|1|1 3|1|101|2020-06-07 06:04:25.841869|2020-06-07 06:04:25.841869|2|1 4|1|101|2020-06-07 06:14:05.411589|2020-06-07 06:14:05.411589|3|1

以下の、quiz_id:1は関連性がうまく行かないため、仮です。
quiz_idを書かないとajaxはsuccessになるが、データベースに保存されないため仮にしています。(また、Strongparameterにしても同様)→保存されない理由はよく分かっていません。

class RankingsController < ApplicationController def create # done1 = Ranking.find_by(user_id:current_user.id)  # done2 = Ranking.find_by(quiz_id:???) このidの取得方法は考えられていません。 # if done1 && done2  # else # flash ~ correct_numbers = current_user.rankings.where(correct:1).count ranking = Ranking.new(user_id: current_user.id, correct:params[:correct], total_correct:correct_numbers, quiz_id:1) #quiz_idは仮(ajaxがerrorになるため。) ranking.save end # end
Rankings/index.html/erb <div class="col-md-7"> <% @feed_items.each do |f|%> <p id="_question"><️空欄に入る適切な語句を選択肢から選びなさい。><br>Question: <%= f.question %></p> <!--問題を入力--> <ul id="choices"> <%= @answer %> <li onclick="goAnswer(1, <%= f.answer %>)"><%= f.choice_1 %></li> <li onclick="goAnswer(2, <%= f.answer %>)"><%= f.choice_2 %></li> <li onclick="goAnswer(3, <%= f.answer %>)"><%= f.choice_3 %></li> <li onclick="goAnswer(4, <%= f.answer %>)"><%= f.choice_4 %></li> by <%=f.user.name%> </ul> <% end %> </div> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script> <script type="text/javascript"> function goAnswer(selectAnswerNo, correctAnswerNo) { if (selectAnswerNo == correctAnswerNo) { swal("正解です!", "他の問題もチャレンジしてみましょう!", "success"); $.ajax({ type: "POST", beforeSend: function(xhr) { xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); }, url: "/rankings", // dataType: "json", data: { "correct": 1, }, success: function (data) { alert("success"); }, error: function (data) { alert("error"); } }); } else { swal("不正解です!", "もう一度チャレンジしてみましょう!", "error"); }; } </script>

Ajaxを使っていることが原因なのでしょうか?どうしても関連がうまく行かないので質問させていただきました。分かる方がいらっしゃいましたらご回答お願いします。

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

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

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

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

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

guest

回答1

0

Ranking.new(user_id: current_user.id とあるのに Rankingに belongs_to :user が無いのは何か意図が有りますか?

data: { "correct": 1, },

ですと渡るparamsは correct だけです。どのquizeに対するものかがわたっていません。
createの中で quiz_id:1 してますが、id=1なquizが無いのでは?

ranking.save! にするとなぜsaveできないかがわかるかも

投稿2020/06/08 12:29

winterboum

総合スコア23401

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問