Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

Ruby on Rails Tutorial マイクロポストのモデル作成、アソシエーション設定

「Ruby on Rails Tutorial」のサンプルアプリをAngularJSとBootstrap3を使う形にして作成します。今回は、各ユーザー情報にマイクロポストを表示する機能を追加します。まず、Railsサーバー側でのモデル作成、バリデーション設定などを行います。

(1)マイクロポスト用のモデル作成

①Micropostモデル作成

下記カラム構成でMicropostモデルを作成します。
カラム名 タイプ
content string
user_id integer

$ rails generate model Micropost content:string user_id:integer

②インデックス追加

"user_id"カラムと自動で作成される"created_at"を同時に指定して multiple key indexとして定義します。

$ vi db/migrate/20150720235403_create_microposts.rb

class CreateMicroposts < ActiveRecord::Migration
  def change
    create_table :microposts do |t|
      t.string :content
      t.integer :user_id

      t.timestamps
    end
    add_index :microposts, [:user_id, :created_at]
  end
end

③マイグレーション実行

$ bundle exec rake db:migrate

④存在チェックのバリデーション定義

・そのマイクロポストはどのユーザーが投稿したのか識別する必要があるので、"user_id"属性に存在チェックのバリデーションを定義します。

・"content"の存在チェックと文字数チェックを行います。

$ vi app/models/micropost.rb

class Micropost < ActiveRecord::Base
  validates :content, presence: true, length: { maximum: 140 }
  validates :user_id, presence: true
end

(2)マイクロポストとユーザーのアソシエーションを設定

・マイクロポストは必ず一人のユーザーによって投稿されます。
belongs_to

・一人のユーザーは複数のマイクロポスを投稿する事が出来ます。
has_many

・ユーザーを削除する際は、そのユーザーが投稿したマイクロポストも一緒に削除する。
dependent: :destroy

①micropostモデルにアソシエーション設定

$ vi app/models/micropost.rb

class Micropost < ActiveRecord::Base
  belongs_to :user
  :

②userモデルにアソシエーション設定

ユーザー削除時(destroyアクション)に、マイクロポストも一緒に削除するようにするため"dependent: :destroy"を指定します。

$ vi app/models/user.rb

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  :

●Railsコンソールで確認

$ rails console

2.0.0p247 :001 > micropost = Micropost.create(content: "Test #1", user_id: 10)

2.0.0p247 :002 > micropost = Micropost.create(content: "Test #2", user_id: 10)

2.0.0p247 :003 > micropost=Micropost.find_by(user_id: 10)
  Micropost Load (0.3ms)  SELECT  "microposts".* FROM "microposts"  WHERE "microposts"."user_id" = 10 LIMIT 1
 => #<Micropost id: 1, content: "Test #1", user_id: 10, created_at: "2015-07-21 00:00:50", updated_at: "2015-07-21 00:00:50">

2.0.0p247 :004 > micropost.user
  User Load (0.1ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = ? LIMIT 1  [["id", 10]]
 => #<User id: 10, name: "testuser10", email: "test10@example.com", created_at: "2015-07-13 08:45:35", updated_at: "2015-07-20 08:30:47", password_digest: "$2a$10$BLM/nUrE1wptItRDOkKm4OynNZ718yjoDnnIBUkWL0s...", remember_token: "48c3edd244e42156c38e89fca5fe5616c5cfcce1", admin: false>