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

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

ただいまの
回答率

90.48%

  • Ruby on Rails

    9026questions

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

  • Active Record

    311questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

【rails】【DB】中間テーブル

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 823

gogoackman3

score 91

やりたいこと

・ユーザーが好きなゲームをフォロー出来る。 
・ユーザーはゲームをフォローする際、自身のゲームレベルをゲーム毎に登録しておける。 
・ゲームはユーザーをフォロー出来ない。(しない)

ここまでは出来た

・ユーザーがゲームをフォローする
・中間テーブルに該当レコードをINSERT

ここが出来ない

・ユーザーがゲームをフォローした際に、中間テーブルでレコード生成し(ここまでならOK)、そのゲーム毎に自身のゲームレベルを中間テーブルの該当レコードのrankカラムに登録しておく

やった事

中間テーブルを作成

class CreateFollowGames < ActiveRecord::Migration[5.0]
  def change
    create_table :follow_games do |t|
      t.boolean :active,  null: false, default: true
      t.references :user, foreign_key: true
      t.references :game, foreign_key: true
      t.integer :rank

      t.timestamps
    end
  end
end

モデルの関連付け

▼user.rb

has_many :follow_games
has_many :following_games, through: :follow_games, source: :game

▼game.rb

関連付けなし

▼follow_game.rb

class FollowGame < ApplicationRecord
  belongs_to :user
  belongs_to :game
end

viewのフォーム作成

= form_for(current_user.follow_games.build) do |f|
            = f.text_field :rank, id:'rank', placeholder: "#{game.rank_name}を入力"
            = f.hidden_field :game_id, value:"#{game.id}"
            = f.submit '追加', id:"rank_set"

controller作成

class FollowGamesController < ApplicationController

  before_action :set_game

  def create
    current_user.following_games << @game unless current_user.following_games.exists?(@game.id)
  end

  private
    def set_game
      @game = Game.find(params[:follow_game][:game_id])
      @game_rank = params[:follow_game][:rank]
    end
end

発生するエラー

やった事のコードを実行すると以下のエラーにご対面・・・。

イメージ説明

教えて欲しい事

どうすれば、ゲームをフォローすると同時に中間テーブルのrankカラムにrank情報を追加出来るのか。

もしかして、rankテーブルを別途用意するようなアプローチじゃないと難しいでしょうか??

何とぞよろしくお願い致します・・・!

質問に関する追記

camelubyさんの質問への追記情報

①この他にbefore_action等ありますか?
→特にありません!

②Gameにrankをセットしていろところは無いようなので。

→rankは中間テーブルにつけていて、Gameテーブルにはありません。
また、postで投げたrank情報は受け取ってはいるものの、前述のcreateのコードでどう使えばいいのか分からず・・・使えていません。。。

以下、Gameのテーブル情報です。

class CreateGames < ActiveRecord::Migration[5.0]
  def change
    create_table :games do |t|
      t.boolean :active,     null: false, default: true
      t.string :title,       null: false, default: ''
      t.string :icon,        null: false, default: ''
      t.string :level_name,  null: false, default: ''
      t.string :search_tag,  null: false, default: ''
      t.integer :feed_range,     null: false, default: 0
      t.integer :follower_num,   null: false, default: 0

      t.timestamps
    end
  end
end

最後に、自分なりに見直して以下のようなコードなら動くようにはなりました。

class FollowGamesController < ApplicationController

  before_action :set_game

  def create
    current_user.follow_games.create(game_id: @game, rank: @game_rank)
  end

  private
    def set_game
      @user = params[:follow_game][:user_id]
      @game = params[:follow_game][:game_id]
      @game_rank = params[:follow_game][:rank]
    end
end

もともと載せていた以下のcreateのコードを利用する形でも前述の《ここが出来ない》の部分のことが実現出来るのでしょうか??

class FollowGamesController < ApplicationController

  before_action :set_game

  def create
    current_user.following_games << @game unless current_user.following_games.exists?(@game.id)
  end

  private
    def set_game
      @game = Game.find(params[:follow_game][:game_id])
      @game_rank = params[:follow_game][:rank]
    end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cameluby

    2016/10/26 21:49 編集

    この他にbefore_action等ありますか?できるだけ多くのコードをお願いします。載せてもらっているコードを見る限りはGameにrankをセットしていろところは無いようなので。

    キャンセル

  • gogoackman3

    2016/10/27 18:10

    ありがとうございます。こちら質問本体に追加情報を書かせていただいたので、確認頂けると嬉しいです!

    キャンセル

回答 1

checkベストアンサー

0

追記も含めて見たところ、質問者さんの実現したいことはシンプルに以下のコードで出来るような気がします。

class FollowGamesController < ApplicationController
  def create
    current_user.follow_games.create(folow_game_params) unless current_user.following_games.exists?(params[:follow_game][:game_id])
  end

  private
    def follow_game_params
      params.require(:follow_game).permit(:game_id, :rank)
    end
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/28 11:04

    ありがとうございます!
    あーそうでした、postで受け取った値は一旦指定の値だけに許可を与えないといけないんでしたね。。。

    お陰様でこちらで問題なく実装できました!

    キャンセル

同じタグがついた質問を見る

  • Ruby on Rails

    9026questions

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

  • Active Record

    311questions

    Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。