演習課題「Playerインデックスにvitalityを表示する」
右の環境には、SinatraとActiveRecordで、MySQLからPlayersテーブルのデータを表示するプログラムが作成してあります。Player一覧画面に、Jobsテーブルのvitalityカラムを追加表示してください。
採点して、すべてのジャッジに正解すれば、演習課題クリアです!
#06:ActiveRecordでテーブルを連結してデータを取り出す
ここでは、ActiveRecordでテーブルを連結してデータを取り出す方法を学習します。
サンプルデータベースで、「players」テーブルの「job_id」と「jobs」テーブルの「id」を結合します。
playersテーブルの複数の項目に対して、jobsテーブルの1つの項目が対応していることを「多対1」の関係になっていると呼びます。
ActiveRecordで、playersテーブル側にjobsテーブルを結合する場合、これを次のように記述します。class Player < ActiveRecord::Base
belongs_to :job
end
# ActiveRecordでテーブルを連結
require 'mysql2'
require 'active_record'
require 'sinatra'
require 'sinatra/reloader'
require 'erb'
ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)
class Player < ActiveRecord::Base
belongs_to :job
end
class Job < ActiveRecord::Base
end
get '/' do
@players = Player.all
erb :index
end
/views/index.erb<h1>Players index</h1>
<table>
<tr>
<th>id</th><th>名前</th><th>レベル</th><th>職業</th>
</tr>
<% @players.each do |player| %>
<tr>
<td><%= player.id %></td>
<td><%= player.name %></td>
<td><%= player.level %></td>
<td><%= player.job.job_name %></td>
</tr>
<% end %>
</table>
- [「一対一」「一対多」「多対多」のリレーションを分かりやすく説明する - akiyoko blog]
http://akiyoko.hatenablog.jp/entry/2016/07/31/232754
- [Active Record の関連付け (アソシエーション) | Rails ガイド]
https://railsguides.jp/association_basics.html