我有一个应用程序,我的用户可以在其中拥有一组偏好。两者都存储为 ActiveRecord 模型,如下所示:
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,我将调用play_sounds
.nil
我要存档的是 User.preference_set 总是返回一个 PreferenceSet 实例。我试过这样定义它:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
这导致 a 'Stack level too deep'
,因为它递归地调用自己。
我的问题是这样的:
如何确保@user.preference_set
返回相应的preference_set-record,或者如果不存在,则构建一个新记录?
我知道我可以重命名我的关联(例如preference_set_real
)并避免以这种方式进行递归调用,但为了我的应用程序的简单起见,我想保留命名。
谢谢!