Edited at
PORTDay 8

[rails]最近覚えた初歩的だけど大事なこと


最近覚えた初歩的だけど大事なこと

最近railsをはじめてこれは大事なだなと思ったことをメモ。


class Article < ActiveRecord::Base

belongs_to :adviser
end

例えばarticleに紐づくadviserのnameを取ろうとしたとき

p = @article.adviser.name

という感じで表示していた。


が、どうもデメテルの法則とかいうのに反しているらしい。


デメテルの法則


あるオブジェクトAは別のオブジェクトBのサービスを要求してもよい(メソッドを呼び出してもよい)が、オブジェクトAがオブジェクトBを「経由して」さらに別のオブジェクトCのサービスを要求してはならない



delegateを使用する

これを解決するには

p = @article.adviser_name

という形だったら問題なさそうなのでこの形にしたいと思う。

これを実現するためにはdelegateというのを使う必要があるっぽい!

modelに

class Article < ApplicationRecord

delegate :name, to: :adviser, prefix: true, allow_nil: true
end

こう書くと

p = @article.adviser_name

これで取れるらしい。


解説

このdelegateを解説させてもらうと、

:nameで委譲するメソッド、to:で委譲先、prefix:をtrueにすれば委譲先委譲するメソッドで取れるし

falseにすれば委譲先.委譲するメソッドとなるらしい。

allow
nil:はnilを許可するかしないか。


まとめ

こんな感じでrailsエンジニアからしたらどうとでもない内容にしまったが

自分としては結構役に立った。