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
を実行できるかも。