封装它的最佳方法

时间:2011-05-05 20:45:40

标签: ruby-on-rails

问题应该很简单,但我在想什么是最好的方法。简单地说,有一个User模型和一个Quest模型。用户有一个任务。现在,我只想检查用户的任务是否已过期。

我以为我必须过期?作为任务的实例方法。现在,我可以做类似的事情:

current_user.quest.expired?

甚至稍后创建一个委托,使其像:

current_user.quest_expired?

然而,这是令人讨厌的。如果用户没有任务,那么这个任务将返回nil错误。我不想事先检查或为User模型创建不同的方法,因为我觉得这打破了封装。

你会怎么做?

3 个答案:

答案 0 :(得分:4)

通常用:

完成
delegate :expired?, :to => :quest, :prefix => true, :allow_nil => true

答案 1 :(得分:1)

通常这会在Rails中以这种方式解决:

定义两种方法:

current_user.quest.expired?
current_user.quest_expired?

并将后一种方法定义为:

def quest_expired?
  return nil unless quest
  quest.expired?
end

然后调用quest_expired?如果您无法确定用户是否有任务。

答案 2 :(得分:1)

current_user.quest.try(:expired?)