はじめまして!
リンクアンドモチベーションの新卒エンジニアの葛葉(くずば)です。
初めに
入社してから、
「全体研修3ヶ月」 -> 「プログラミング研修3ヶ月」 -> 「配属されて3ヶ月」
と、泣いたり笑ったり苦しんだりしながら学びの多い日々を過ごしてきました。
現在は、営業する上で必要なデータをSQLを書いて出す作業や、簡易なバックエンドの実装(Ruby on Rails)などの業務を行っています。
しかし、2つ目のバックエンドの実装業務では、研修では全く学んでいない内容がたくさんあり、分からないことばかりです。。。
そこで、メンターと相談して、Rails4技術者認定シルバー試験(Rails Silver)を受けることにしました。
よく使われる公式問題集を中心に勉強を進めているので、
その中で解いてきた問題に類似した問題を2つ作成したので、紹介したいと思います。
ぜひ、何も見ずに解けるか試してみてください!!
問題
問題1
Active Recordを使用し、次のようなモデル定義を行なっている。
class sports < ActiveRecord::Base
has_many :skills
end
class skills < ActiveRecord::Base
belongs_to :sports
end
実行した時に次のSQLが発行されるものを1つ選びなさい。
SELECT "sports".* FROM "sports"
SELECT "skills".* FROM "skills"."sport_id" IN (1,2)
A. Sport.includes(:skills)
B. Skill.includes(:sport)
C. Sport.joins(:skills)
D. Skill.joins(:sport)
問題2
ネストしたルーティングについて、以下の設定と同等ではないものをA~Cの中から1つ選びなさい。
shallow do
resources :sports do
resources :skills
end
end
A.
resources :sports do
resources :skills, shallow: true
end
B.
resources :sports do
resources :skills, only: [:index, :new, :create]
end
C.
resources :sports do
resources :skills, only: [:index, :new, :create]
end
resources :skills, only: [:show, :edit, :update, :destroy]
解答と解説
問題1の答え
A
(以下解説)
Active Recordに関する問題です。
問題文の発行されたSQLを見ると、テーブルがjoinされていないため、
joinsメソッドを使った選択肢C, Dは違うことが分かります。
次に、includesメソッドを使用している選択肢A, Bを考えます。
まず、sport.rbでhas_manyメソッドで記載されていることからもわかるように、sportsテーブルとskillsテーブルとの関係は1対多であることが分かります。
また、問題文を見てみると、
SELECT "skills".* FROM "skills"."sport_id" IN (1,2)
となっており、
skillsテーブルのsport_idのカラムからデータを取得しようとしていることが分かります。
テーブルの関係性や最終的にskillsテーブルからデータを得ようとしていることからも、
A. Sport.includes(:skills)
が正しいといえます。
問題2の答え
B
(以下解説)
ルーティングとAction Controllerに関する問題です。
ネストしたresourcesメソッドを使うと、親子関係のリソースのルートを設定できます。
たとえば、スポーツとそのスポーツの技を表示させるサイトで、
1番のスポーツの10個目の技を表示させたいとき、URLとしては、
sports/1/skills/10
となり、子リソースの10だけで表示する内容が一意になるにも関わらず、
親リソースの情報もURLに書かなくてはなりません。
そこで、shallowメソッドを使います。
shallowメソッドでは、ネストしたresourcesメソッドを囲むことで、親リソースのID(sport_id=1)を指定しなくても表示させたい技のページを表示させることができます。
これらを踏まえて、選択肢を見ると、
選択肢Aでは、子リソースでshallowオプションを指定することで、問題文と同じ設定を行うことができると分かります。
また、選択肢Cでも、子リソース(skills)のコレクションルート(:idがつかないURIを生成する)のみを親リソースの中に組み込んだあと、
skillsのメンバールート(:idがつくURIを生成する)を別途設定しているため、
この設定に関しても、子リソースのskill_idの情報さえ揃っていれば、技のページに飛べるようになります。
一方で、選択肢Bでは、選択肢Cのようにskillsのメンバールートの設定が行われていないため、技のページに飛ぶことはできません。
終わりに
今回の問題は、Rails4技術者認定シルバー試験問題集を参考に問題を作成しております。
これまでRailsを触り始めて5ヶ月目の僕からすると、ちょっと難しいのですが、今後も勉強を続けていこうと思います。
そして、Ruby on Rails脱初心者を目指します!
最後までご覧いただき、ありがとうございました!