如何处理可选的belongs_to关联

问题描述:

USECASE:如何处理可选的belongs_to关联

请考虑以下示例。

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

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

问题:

问题是我认为的代码获取了很多,如果条件像三元操作混乱,

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

目前的解决方案:

为了克服这个问题,我使用空对象设计模式。 User类定义了一个NullUser对象(其名称将被设置为“未设置”)。如果一个foo对象没有用户对象,它将返回一个NullUser对象。我已经重写了Foo类中的用户方法,它没有进行零检查。

问题:

  1. 是否有更好的解决方案呢?
  2. 有没有一个宝石,它有助于 轨道活动记录模型的空对象模式。

一个可能的解决方案是设置默认值并将其与访客用户相关联。这样当用户在场时它会被覆盖,但意味着当你打电话时,总会有一个值。用户名

这听起来像是包装你的用户对象的装饰器的最佳例子。所有关于显示内容的逻辑都在那里;你所关注的所有观点都是它可以吐出对象的名字。

Draper适用于Rails中的装饰器。

和一个Railscast为好措施。