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