Ruby on Rails 13章micropostモデル

Ruby on Rails 13章micropostモデルをやりました。

●micropostモデル
rails generate model Micropost content:text user:references

micropost.rbには
belongs_to :user
とあり、当該モデルがUserリソースに関連を持つことが示されている。

DDLに相当するファイルをみると、
def change
create_table :microposts do |t|
t.text :content
t.references :user, foreign_key: true
t.timestamps
end
end

上記のDDL相当ファイルに
ユーザごとの投稿にアクセスしやすくするためインデックスを貼る
add_index :microposts, [:user_id, :created_at]

p.update_attributes( user_id: 1, content: ‘Lorem ipsum’ )
p
=> #<Micropost id: 1, content: “Lorem ipsum”, user_id: 1,
created_at: “2019-08-27 14:08:07”,
updated_at: “2019-08-27 14:08:07”>

p.user
=> #<User id: 1, name: “Example User”, email: “example@railstutorial.org”,
created_at: “2019-08-21 19:34:43”,
updated_at: “2019-08-21 19:34:43”,
password_digest: “$2a$10$UA.rO79v7mL0Nx0TYmluk..GoA4K5TmU.CL/B8INEC7…”,
remember_digest: nil, admin: true,
以下略

●多重度
belong_to, has_many
モデルとモデルの間に、1:N or 1:1関係を設定する。
この設定があると、

user.microposts.create
のようなチェーンな呼び出しができる。
(new:オブジェクト生成のみ。createは、 new + save)
チェーンするなら、newはbuildになる。

例:
@micropost = @user.microposts.build(content: ‘Lorem ipsum’)

micropost.rb
belongs_to :user

user.rb
has_many :microposts

これは最高にいい。
組織やユーザの管理するときなどは、
組織コードを指定して、配下組織をとってくるとか、
所属ユーザをとってくるなんてのはザラにあるから。
→こういうところの小回りの問題で、sqlをゴリゴリ書くし、
dtoやMap、Listにセットしまくる手間が軽減。

●テスト実行(1ファイルごと)
rails test test/models/micropost_test.rb

●デフォルトスコープ
・指定の仕方
order(:created_at)
order(‘created_at DESC’)
order(created_at: :desc)

・実装場所
モデルに、下記のようにデフォルトスコープをかく。
default_scope -> { order(created_at: :desc) }
default_scopeに指定した無名関数がコールされる。

●dependent: :destroy
モデルの、
has_many :micropostsの後ろに書く。

ユーザが削除されると、その先のmicropostsを削除する。

これも素晴らしい。
もしかしたら、
dependent: :hoge
にして、ユーザモデルに
def hoge~end
を実行できるかも。

コメントを残す

メールアドレスが公開されることはありません。