给定以下(大大简化的)对象:
class Player < ActiveRecord::Base
has_many :characters
end
class Character < ActiveRecord::Base
belongs_to :player
delegate :name, :to => :player, :prefix => :player
end
我需要在多个 View 中显示玩家名称。但是 Player 可能为 nil 是完全有效的(并且是预期的)。
我目前通过以下方法处理此问题:
class Character < ActiveRecord::Base
belongs_to :player
def player_name
player ? player.name : 'Unknown'
end
end
我不喜欢这个有几个原因。有更好的方法吗?
最佳答案
如果您主要处理与 View 相关的代码,您可能会发现在 delegate
调用中将“or”与 allow_nil: true
结合使用感觉很自然:
Name: <%= @character.player_name || 'Unknown' %>
您可能会考虑的另一个有趣的模式是 null object pattern ;使用此模式,您可以使用表示该对象的“空”或缺失值的对象来描述“默认”行为。例如,(伪代码):
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
这种模式有点笨拙,但您可能会发现它适合您的应用。
最后,the code for delegate
isn't too complicated .您可以编写此方法的您自己的版本,它采用默认
参数以在nil
的情况下使用:
delegate :name, to: :player, prefix: :player, default: 'Unknown'
关于ruby - 导轨 3 : method delegations with nil relationships,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16493461/