Ruby on Rails チュートリアル 「第11章 ユーザのマイクロポスト」をやってみた
Ruby on Rails チュートリアルの第11章のメモです。第11章では、チュートリアルで作成するサンプルアプリのメイン機能であるTwitterの投稿機能のようなものを作成します!モデルとモデルの関連付けを行うメソッドhas_many
やbelongs_to
を学ぶことができます!
第11章ユーザーのマイクロポスト | Rails チュートリアル
マイグレーション生成の際、関連付けを定義するためには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_many
やbelongs_to
を使うことでモデル同士の関連付けを行うことができるdeafault_scope
を使うとレコードの順序を変更できるdependent: :destroy
を使うと、関連付けされたオブジェクトが削除されると同時に自分自身も削除する
関連付け等は、CakePHPとほぼほぼ同じ
かかった時間は3時間ほど
Ruby on Rails チュートリアル 第10章までかかった合計時間は22時間
次回、遂に最後の章!
Ruby on Rails チュートリアル 「第12章 ユーザをフォローする」をやってみた
Ruby on Railsのおすすめ書籍はこちら!