gpt4 book ai didi

ruby-on-rails - rails : Create association if none is found to avoid nil errors

转载 作者:行者123 更新时间:2023-12-02 01:01:11 25 4
gpt4 key购买 nike

我有一个应用程序,我的用户可以在其中拥有一组首选项。两者都存储为 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,并且我将在 nil 上调用 play_sounds

我想要归档的是 User.preference_set 总是返回一个 PreferenceSet 实例。我尝试过这样定义它:

class User < ..
has_one :preference_set

def preference_set
preference_set || build_preference_set
end
end

这会导致“堆栈级别太深”,因为它递归地调用自身。

我的问题是这样的:

如何确保@user.preference_set返回相应的preference_set记录,或者如果不存在,则构建一个新记录?

我知道我可以重命名我的关联(例如preference_set_real)并通过这种方式避免递归调用,但为了我的应用程序的简单性,我想保留命名。

谢谢!

最佳答案

有一个优雅简单的形式:

class User < ApplicationRecord
has_one :preference_set

def preference_set
super || build_preference_set
end
end

ActiveRecord intentionally enables这种使用 super 来覆盖关联方法的行为。

关于ruby-on-rails - rails : Create association if none is found to avoid nil errors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3812667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com