我有一个应用程序,我的用户可以拥有一组首选项.两者都存储为ActiveRecord模型,如下所示:
class User < AR::Base
has_one :preference_set
end
class PreferenceSet < AR::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
我现在可以访问用户的首选项:
@u = User.first
@u.preference_set => #<PreferenceSet...>
@u.preference_set.play_sounds => true
Run Code Online (Sandbox Code Playgroud)
但是,这是否偏好设置尚未创建,因为@ 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
Run Code Online (Sandbox Code Playgroud)
这导致a 'Stack level too deep',因为它以递归方式调用自身.
我的问题是:
如何确保@user.preference_set返回相应的preference_set-record,如果不存在则返回构建新的记录?
我知道我可以重命名我的关联(例如preference_set_real)并以这种方式避免递归调用,但为了我的应用程序的简单性,我想保留命名.
谢谢!