最近覚えた初歩的だけど大事なこと
最近railsをはじめてこれは大事なだなと思ったことをメモ。
例
.rb
class Article < ActiveRecord::Base
belongs_to :adviser
end
例えばarticleに紐づくadviserのnameを取ろうとしたとき
.slim
p = @article.adviser.name
という感じで表示していた。
が、どうもデメテルの法則とかいうのに反しているらしい。
デメテルの法則
あるオブジェクトAは別のオブジェクトBのサービスを要求してもよい(メソッドを呼び出してもよい)が、オブジェクトAがオブジェクトBを「経由して」さらに別のオブジェクトCのサービスを要求してはならない
delegateを使用する
これを解決するには
.slim
p = @article.adviser_name
という形だったら問題なさそうなのでこの形にしたいと思う。
これを実現するためにはdelegateというのを使う必要があるっぽい!
modelに
.rb
class Article < ApplicationRecord
delegate :name, to: :adviser, prefix: true, allow_nil: true
end
こう書くと
.slim
p = @article.adviser_name
これで取れるらしい。
解説
このdelegateを解説させてもらうと、
:nameで委譲するメソッド、to:で委譲先、prefix:をtrueにすれば委譲先_委譲するメソッドで取れるし
falseにすれば委譲先.委譲するメソッドとなるらしい。
allow_nil:はnilを許可するかしないか。
まとめ
こんな感じでrailsエンジニアからしたらどうとでもない内容にしまったが
自分としては結構役に立った。