7

次の (大幅に簡略化された) オブジェクトがあるとします。

class Player < ActiveRecord::Base
  has_many :characters
end

class Character < ActiveRecord::Base
  belongs_to :player
  delegate :name, :to => :player, :prefix => :player
end

複数のビューでプレイヤー名を表示する必要があります。しかし、 Player が nil である可能性は完全に有効です (そして予想されます)。

現在、次の方法でこれを処理しています。

class Character < ActiveRecord::Base
  belongs_to :player

  def player_name
    player ? player.name : 'Unknown'
  end
end

私はいくつかの理由でこれが好きではありません。これを行うより良い方法はありますか?

4

1 に答える 1

23

主にビュー関連のコードを扱っている場合は、「or」をallow_nil: trueon the delegatecall と組み合わせて使用​​すると自然に感じるかもしれません。

Name: <%= @character.player_name || 'Unknown' %>

もう 1 つの興味深いパターンとして、null オブジェクト パターンがあります。このパターンを使用して、そのオブジェクトの「null」または欠損値を表すオブジェクトを使用して「デフォルト」の動作を記述します。たとえば、(疑似コードっぽい):

class NullPlayer
  def name
    'Unknown'
  end
end

class Character < ActiveRecord::Base
  belongs_to :player

  delegate :name, to: :player, prefix: :player, allow_nil: true

  # overwrite default player accessor
  def player
    super || NullPlayer.new
  end
end

このパターンは少し手間がかかりますが、アプリケーションによっては適切な場合があります。

最後に、のコードdelegateはそれほど複雑ではありません。次の場合に使用する引数を取るこのメソッドの独自のバージョンを作成できます。defaultnil

delegate :name, to: :player, prefix: :player, default: 'Unknown'
于 2013-05-11T05:41:47.840 に答える