ユーザーが一連の設定を行えるアプリケーションがあります。どちらも次のように 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
onを呼び出すため、設定セットがまだ作成されていない場合、これは失敗しますnil
。
アーカイブしたいのは、 User.preference_set が常に PreferenceSet インスタンスを返すことです。私はそれを次のように定義しようとしました:
class User < ..
has_one :preference_set
def preference_set
preference_set || build_preference_set
end
end
'Stack level too deep'
再帰的に自分自身を呼び出しているため、これは を引き起こしています。
私の質問はこれです:
対応するpreference_set-recordを@user.preference_set
返すか、存在しない場合は新しいレコードを作成するにはどうすればよいですか?
アソシエーションの名前を変更するだけでよいことはわかっていますが (例: preference_set_real
)、この方法で再帰呼び出しを回避できますが、アプリをシンプルにするために、この名前をそのまま使用したいと思います。
ありがとう!