小编Mat*_*ias的帖子

Rails:如果找不到任何错误,则创建关联

我有一个应用程序,我的用户可以拥有一组首选项.两者都存储为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_soundsnil.

我想归档的是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)并以这种方式避免递归调用,但为了我的应用程序的简单性,我想保留命名.

谢谢!

activerecord ruby-on-rails has-one

13
推荐指数
2
解决办法
7784
查看次数

标签 统计

activerecord ×1

has-one ×1

ruby-on-rails ×1