【问题标题】:Rails 3: method delegations with nil relationshipsRails 3:具有零关系的方法委托
【发布时间】:2013-05-11 03:32:01
【问题描述】:

给定以下(大大简化的)对象:

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

我不喜欢这个有几个原因。有更好的方法吗?

【问题讨论】:

  • 代表有 :allow_nil => true apidock.com/rails/v3.0.9/Module/delegate
  • 感谢肖恩,我在发布问题后发现并开始使用它。我希望有一种定义“默认”值的方法,但我认为在我的观点中将其设为“空”几乎一样好/信息丰富,并且确实清理了我的模型。

标签: ruby activerecord ruby-on-rails-3.1


【解决方案1】:

如果您主要处理与视图相关的代码,您可能会发现在 delegate 调用中使用“或”与 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 的情况下使用default 参数:

delegate :name, to: :player, prefix: :player, default: 'Unknown'

【讨论】:

  • 谢谢.. 真的很有帮助。
  • 要注意的一个重要部分是prefix: :player,我现在正处于一种地狱中,正在处理我自己的错误,即没有将其添加到大型代码库中的委托方法中,我真的希望我已经添加了它。
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 1970-01-01
相关资源
最近更新 更多