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
=> #

2.0.0p247 :004 > micropost.user
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 10]]
=> #

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です