gpt4 book ai didi

ruby-on-rails - Rails has_one build_association 在保存前删除记录

转载 作者:行者123 更新时间:2023-12-04 08:35:22 24 4
gpt4 key购买 nike

所以之前有人问过这个问题,但没有令人满意的答案。

考虑两个模型,User , 和 Subscription关联如下:

class User < ActiveRecord::Base
has_one :subscription, dependent: :destroy
end

class Subscription < ActiveRecord::Base
belongs_to :user
end

在 SubscriptionsController 中,我有一个看起来像这样的新操作
def new
user = User.find(params[:user_id])
@subscription = user.build_subscription
end

鉴于用户记录已经存在订阅,我面临以下问题:
user.build_subscription破坏性 , 意思就是 访问 new action 实际上会破坏关联,从而丢失当前的订阅记录。

现在,我可以简单地检查订阅的存在并像这样重定向:
def new
user = User.find(params[:user_id])
if user.subscription.present?
redirect_to root_path
else
@subscription = user.build_subscription
end
end

但这似乎并不那么优雅。

这是我的问题

不应该只是建立一个 暂定协会记录 不具破坏性 ?
这不违反 RESTful 路由吗,因为 new使用 GET 请求访问, 不应该 修改记录?

或者也许我做错了什么。我应该以不同的方式建立记录吗?也许通过 Subscription.new(user_id: user.id) ?似乎没有多大意义。

非常感谢您解释为什么以这种方式实现以及您将如何处理此问题。

谢谢!

最佳答案

我今天遇到了这个问题,我同意当你调用 build 时从数据库中删除一些东西是一个非常意外的结果(导致我们有错误的数据)。正如您所建议的,您只需执行 Subscription.new(user: user) 即可轻松解决问题。我个人认为它的可读性并不比 user.build_subscription 低得多。

关于ruby-on-rails - Rails has_one build_association 在保存前删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20945853/

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