LoginSignup
0
0

More than 3 years have passed since last update.

【Ruby On Rails】親テーブルのデータを子テーブルから検索・保存する方法

Last updated at Posted at 2020-12-30

本記事について

備忘録です。

子コントローラーにてcreateアクション、include?メソッドを用いて、親テーブルのデータを検索し、その検索したデータと同じ内容が含まれている場合に、子テーブルのカラムへ保存できるようにします。

include?メソッドとは

ある数値や文字列などのデータが含まれているかどうかを確認するために、include?メソッドを使います。

例えば、

サンプルコード
  array = [aiueo, yayuyo]

  puts array.include?(aiueo)
  puts array.include?(yayuyo)
  puts array.include?(wawon)
実行結果
  true
  true
  false

と、なります。

前提


親:parentsテーブル

id word
1 あいうえお

子:kidsテーブル(まだデータは登録されていません)

id text word_id


【親のビュー】→【子のビュー】→【newアクション(データ登録画面)】を経て、@kidのparamsにはword_idが含まれているものとします。

本題

今回は親テーブルの"word"カラムの中身を検索し、ユーザーが入力したデータと一致しているかどうかを調べます。一致していれば保存します。データを保存する際に、親テーブルのカラム情報が含まれているかどうかを判別したいので、if文に任意のメソッド名を追加します。今回はhaving_word?とします。

実際に処理をするメソッドを書いていきます。

① having_word?を定義する。

kids_controller.rb
  def having_word?

  end

② ユーザーが入力したデータ(@kid)に対して、特定のデータが含まれているかを調べる(include?)。

kids_controller.rb
  def having_word?
    @kid.include?
  end

③ 「特定のデータをどうやって調べるか」を書くための欄を設ける。→include?の直後に()を記述する。

kids_controller.rb
  def having_word?
    @kid.include?()
  end

④ createアクションに至るまでのparamsを参照するため、@kidを記述する。

kids_controller.rb
  def having_word?
    @kid.include?(@kid)
  end

⑤ paramsに含まれているparent(parentsテーブル)の情報を取得する

kids_controller.rb
  def having_word?
    @kid.include?(@kid.parent)
  end

⑥ "⑤"で取得したparentの情報から、wordカラムを取り出す。

kids_controller.rb
  def having_word?
    @kid.include?(@kid.parent.word)
  end

include?の()内は、簡単に言えば子から親の情報へ遡って行く感じだと思います。

createアクションを実行し、データが保存された場合のテーブル例

親:parentsテーブル

id word
1 あいうえお
2 元気
3
4 english

子:kidsテーブル

id text word_id
1 あいうえお 1
2 あいうえお順 1
3 あいうえお表 1
4 あいうえお作文 1
5 お元気ですか? 2
6 めちゃくちゃ元気です。 2
7 自走力 3
8 走行距離 3
9 I have studied english for 5 years. 4
10 just a random english comment passing by. 4

最後に

プログラミング初学者のため、至らない点がございましたらご指摘お願いいたします。
バリデーションエラーメッセージが表示されない問題については今後理解指定いく必要があると思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0