ruby - 导轨 3 : method delegations with nil relationships

标签 ruby activerecord ruby-on-rails-3.1

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

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/

相关文章:

ruby-on-rails - 如何找出哪个 Ruby gem 劫持了 ActiveRecord 关联方法

ruby-on-rails-3 - Rails 3.1 从供应商/ Assets /图像提供图像

ruby-on-rails - rails : find all parents with all children having a particular attribute

c++ - 为 Homebrew 软件构建 C++ 公式

ruby - 将字符串 ID 与 BSON::ObjectId 进行比较

ruby-on-rails-3.1 - 安装debugger-linecache时出错:错误:无法构建gem native 扩展

ruby-on-rails - 可以在 form_for helper rails 3 中发送多种格式

ruby-on-rails - 在 RSpec 中获取 'Bad value for range'

php - 使用模型时如何在 PHP Active Record 中创建事务?

ruby-on-rails - Rails不会触发我的after_commit回调