【发布时间】:2010-09-28 12:29:52
【问题描述】:
我有一个应用程序,我的用户可以在其中拥有一组偏好。两者都存储为 ActiveRecord-models,如下所示:
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
我现在可以访问用户的首选项:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
但是,如果尚未创建首选项集,则此操作将失败,因为 @u.preference_set 将返回 nil,并且我将在 nil 上调用 play_sounds。
我要归档的是 User.preference_set 总是返回一个 PreferenceSet 实例。我试过这样定义它:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
这会导致'Stack level too deep',因为它正在递归调用自身。
我的问题是这样的:
如何确保@user.preference_set 返回相应的preference_set-record,或者如果不存在,则构建一个新记录?
我知道我可以重命名我的关联(例如preference_set_real)并避免以这种方式进行递归调用,但为了我的应用程序简单起见,我想保留命名。
谢谢!
【问题讨论】:
标签: ruby-on-rails activerecord has-one