9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PORTAdvent Calendar 2018

Day 8

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

Last updated at Posted at 2018-12-07

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

最近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エンジニアからしたらどうとでもない内容にしまったが
自分としては結構役に立った。

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?