如何处理可选的belongs_to关联

时间:2013-04-25 10:11:24

标签: ruby-on-rails activerecord null-object-pattern

USECASE:

请考虑以下示例。

Class Foo < ActiveRecord::Base
 belongs_to :user
 attr_accessible :title
end
Class User < ActiveRecord::Base
 has_many :foo
 attr_accessible :name
end

如果登录用户创建Foo,它将与其用户记录关联。如果未登录的用户创建Foo,则它不会与任何用户关联。这只是一个例子,我的应用程序中有很多类似的用例。

问题:

问题是我的视图代码变得混乱了很多if条件和三元操作,如

<% foo.user ? foo.user.name : "not set"%>

当前解决方案:

为了解决这个问题,我使用的是空对象设计模式。 User类定义NullUser对象(其名称将设置为“not set”)。如果foo对象没有用户对象,它将返回一个NullUser对象。我已经覆盖了Foo类中的用户方法,该方法执行nil检查。

问题:

  1. 有更好的解决方案吗?
  2. 是否有促进的宝石 rails活动记录模型的空对象模式。

2 个答案:

答案 0 :(得分:1)

对于包装用户对象的装饰器来说,这听起来很完美。关于展示什么的所有逻辑都在那里;所有你关注的是它可以吐出对象的名字。

Draper适用于Rails中的装饰器。

Railscast表示好的措施。

答案 1 :(得分:0)

一种可能的解决方案是设置默认值并将其与访客用户关联。这样,当用户出现时它将被覆盖,但是当你调用.user.name

时意味着总会有一个值。