#本記事について
備忘録です。
子コントローラーにて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?を定義する。
def having_word?
end
② ユーザーが入力したデータ(@kid)に対して、特定のデータが含まれているかを調べる(include?)。
def having_word?
@kid.include?
end
③ 「特定のデータをどうやって調べるか」を書くための欄を設ける。→include?の直後に()を記述する。
def having_word?
@kid.include?()
end
④ createアクションに至るまでのparamsを参照するため、@kidを記述する。
def having_word?
@kid.include?(@kid)
end
⑤ paramsに含まれているparent(parentsテーブル)の情報を取得する
def having_word?
@kid.include?(@kid.parent)
end
⑥ "⑤"で取得したparentの情報から、wordカラムを取り出す。
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 |
最後に
プログラミング初学者のため、至らない点がございましたらご指摘お願いいたします。
バリデーションエラーメッセージが表示されない問題については今後理解指定いく必要があると思いました。