目次

2009年1月27日火曜日

Ruby on Rails (4) ~テーブル同士の連携、1対多編~

今回は複数のテーブルを連携させてみましょう。
前に作ったtest003(チュートリアル(2))を使います。

songというテーブルを作って、userテーブルで読み込みます。

まずはmodelの作成
ruby script/generate model song

XXXXXX_create_songsを編集します。
class CreateSongs < ActiveRecord::Migration
def self.up
create_table :songs do |t|
t.column :song_name, :string # 曲名
t.column :artist_name, :string # アーティスト
t.column :song_url, :string # URL
t.timestamps
end
end

def self.down
drop_table :songs
end
end


次はymlの編集。フィクスチャファイルsongs.ymlをdb>fixtures>decelopmentに作ります。
# 開発環境のためのフィクスチャ: songs
one:
id: 1
song_name: test1
artist_name: さとう # アーティスト
song_url: http://google.co.jp # URL
created_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>
updated_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>

two:
id: 2
song_name: test2
artist_name: やまだ # アーティスト
song_url: http://google.co.jp # URL
created_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>
updated_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>

three:
id: 3
song_name: test3
artist_name: すずき # アーティスト
song_url: http://google.co.jp # URL
created_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>
updated_at: <%= Time.now.strftime("%Y-%m-%d %H:%M:%S") %>


完成したら
rake db:initialize

では、連携させましょう。
app>modelsの中のuser.rbとsong.rbをそれぞれ編集します。

user.rb
class User < ActiveRecord::Base
belongs_to :song
end


song.rb
class Song < ActiveRecord::Base
has_many :users
end

belopgs_toで、そのデータベースからは1つのデータとしか対応していないことを表し、has_manyで複数のデータと対応していることを示します。
song対userが1対多の関係になっています。1対1ではないのは、同じ曲を聴いている人もいるからです。
しかし、これだけではまだまだ。外部キーというものをテーブルの中につくって、ようやくテーブルからテーブルへデータを引き渡せるのです。
マイグレーション用のモデル、XXXXXXXX_create_users.rbを編集して、外部キーを新しく設けます。
t.column :listening_song, :string
ここを消して、
t.column :song_id, :integer # 外部キー
これを代入します。

これでuserを通してsongのデータベースを引っ張って来れるようになりました。

最後にviewの編集です。
といってもこれまで
@user.listening_songと記述していた所を、
@user.song.song_nameと変えるだけです!
テーブル名.テーブル名.フィールド名でデータを持って来れるという簡単さ!!!!

0 件のコメント: