首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在超级堆栈中,删除方法不更新数据库中的has_many关系

在超级堆栈中,删除方法不更新数据库中的has_many关系
EN

Stack Overflow用户
提问于 2019-09-07 04:22:51
回答 1查看 44关注 0票数 0

当我使用delete方法更新超级堆栈模型中的has_many关系时,关联不会在数据库中更新,关联只在前端被删除。

我已经安装了rails -超级堆栈创业板'edge‘分支,在rails 5.1.7上

在此代码中的主组件中,当单击页面中的数字时调用Agent#deassign( number )。

我试图在此代码中使用Agent#deassign(number)方法中的delete方法来删除与某个问题的关联。

app\hyperstack\components\main.rb

代码语言:javascript
复制
class Main < HyperComponent
  before_mount do
    @current_agent = Agent.first
  end

  render(UL) do
    @current_agent.issues.pluck(:number).each do |num|
      LI do
        num.to_s
      end
        .on(:click) do
          @current_agent.deassign(num)
        end
    end
  end
end

app\hyperstack\models\issue.rb

代码语言:javascript
复制
class Issue < ApplicationRecord
  belongs_to :agent
end

app\hyperstack\models\agent.rb

代码语言:javascript
复制
class Agent < ApplicationRecord
  has_many :issues

  def deassign(number)
    issue_to_deassign = issues.detect { |issue| issue.number == number }
    issues.delete(issue_to_deassign)
  end
end

app\db\schema.rb

代码语言:javascript
复制
...
  create_table "agents", force: :cascade do |t|
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
...
  create_table "issues", force: :cascade do |t|
    t.integer "number"
    t.integer "agent_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["agent_id"], name: "index_issues_on_agent_id"
  end

该问题将从前端的agent.issues数组中删除,并按预期从页面中消失。

但是关联不会意外地在数据库中更新,当我重新加载页面时,这个数字会重新出现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-08 03:05:14

与普通的服务器端ActiveRecord API不同,您需要显式保存已删除的项。

代码语言:javascript
复制
issues.delete(issues_to_deassign).save

为什么?问题是删除一个项目意味着数据库的保存将会发生。由于浏览器必须与服务器异步,Hyper堆栈返回对任何更新数据库的AR方法(即保存、更新、创建等)的承诺。然后,当数据库更新完成时,承诺将得到解决。然而,期望delete方法返回刚刚删除的对象,因此我们有一个矛盾。因此有3种设计选择。。

  1. 破坏删除的工作方式,做保存并返回承诺;
  2. 有删除做保存,而不是承诺返回删除的项目;
  3. 有删除返回项,并让开发人员执行保存explicitly.Options 1和2,这是不好的,因为使删除操作inflexible.Option 3,而打破标准语义的ActiveRecord允许这些语义可以很容易地实现,如果需要(即添加save到末尾),而不牺牲灵活性。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57830656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档