Ruby on Rails

【Ruby on Rails】チュートリアル 「第11章 ユーザのマイクロポスト」をやってみた

Ruby on Rails チュートリアル 「第11章 ユーザのマイクロポスト」をやってみた

Ruby on Rails チュートリアルの第11章のメモです。第11章では、チュートリアルで作成するサンプルアプリのメイン機能であるTwitterの投稿機能のようなものを作成します!モデルとモデルの関連付けを行うメソッドhas_manybelongs_toを学ぶことができます!

第11章ユーザーのマイクロポスト | Rails チュートリアル

Railsチュートリアル第11章をやってみた

マイグレーション生成の際、関連付けを定義するためにはreferences型を使用する

$ rails generate model Micropost content:text user:references

こうすることで、自動的にインデックスと外部参照キー付きのuser_idカラムが追加される

関連付けされたモデルのレコード生成方法

関連付けされたモデルのレコードを作成するときは、紐付いているモデルを経由して生成することで外部キーが自動的に正しい値に設定される

user.microposts.create
user.microposts.create!
user.microposts.build

newメソッドと同様、buildメソッドはオブジェクトを返すがデータベースには反映されない

user/micropost関連メソッドのまとめ

メソッド 用途
micorpost.user Micropostに紐付いたUserオブジェクトを返す(belongsTo)
user.microposts UserのMicropost集合を返す(hasMany)
user.microposts.create(arg) userに紐付いたMicropostを生成する
user.miciroposts.create!(arg) userに紐付いたMicropostを生成する(失敗時に例外発生)
user.microposts.build(arg) userに紐付いた新しいMicripostオブジェクトを返す
user.microposts.find_by(id: 1) userに紐付いていて、idが1であるMicropostを返す

レコードを逆順で取得する

Railsのdefault scopeメソッドを使用する
このメソッドは、データベースから要素を取得した時のデフォルトの順序を指定する
特定の順序にしたい場合は、default_scopeの引数にorderを与える
例えば、created_atの降順にしたい場合は次のようにかく

order(:created_at DESC)

Rubyの4.0からは

order(created_at: :desc)

と書くことができる

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end

ユーザが破棄された時、同時に投稿も消す設定

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

Railsはクラス名でパーシャルを自動探索してくれる

<%= render @feed_items %>

@feed_itemsの各要素がMicropostクラスを持っていると、
Railsは対応する名前のパーシャルを、与えられたリソースのディレクトリ内から探してくれる
したがって、
app/views/micorposts/_micorpost.html.erbからパーシャルを呼び出してくれる

Railsチュートリアルでの画像アップロード

RailsチュートリアルではCarrierWaveという画像アップローダーを使う
GemfileにCarrierWaveに追加すると、Railsのジェネレーターで画像アップローダーを生成できるようになる

rails generate uploader Picture

CarrierWaveでアップロードされた画像は、ActiveRecordモデルの属性と関連付けにするべき

rails generate migration add_picture_to_microposts picture:string

関連付けするモデルにアップローダーを追加するには、
mount_uploaderというメソッドを関連付けするモデルに追加する

class Micropost < ActiveRecord::Base
  belongs_to :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id, presence: true
  validates :content, presence: true, length: { maximum: 140 }
end

Ruby on Rails チュートリアル 「第11章 ユーザのマイクロポスト」のまとめ

  • Railsは複数のキーインデックスをサポート
  • has_manybelongs_toを使うことでモデル同士の関連付けを行うことができる
  • deafault_scopeを使うとレコードの順序を変更できる
  • dependent: :destroyを使うと、関連付けされたオブジェクトが削除されると同時に自分自身も削除する

関連付け等は、CakePHPとほぼほぼ同じ
かかった時間は3時間ほど
Ruby on Rails チュートリアル 第10章までかかった合計時間は22時間
次回、遂に最後の章!
Ruby on Rails チュートリアル 「第12章 ユーザをフォローする」をやってみた

Ruby on Railsのおすすめ書籍はこちら!


-Ruby on Rails