0

当我在Hyperstack上使用delete方法更新模型中的has_many关系时,数据库中没有更新关联,仅在前端删除了关联。

我在 rails 5.1.7 上安装了 rails-hyperstack gem 'edge' 分支

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

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

app\hyperstack\components\main.rb

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

class Issue < ApplicationRecord
  belongs_to :agent
end

app\hyperstack\models\agent.rb

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

应用\db\schema.rb

...
  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数组中删除,数字按预期从页面消失。

但是数据库中的关联没有意外更新,当我重新加载页面时,数字重新出现。

4

1 回答 1

0

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

issues.delete(issues_to_deassign).save

为什么?

问题是删除项目意味着将发生数据库保存。

因为浏览器必须与服务器异步,Hyperstack 会为任何更新数据库的 AR 方法(即保存、更新、创建等)返回一个 Promise。然后,当数据库更新完成时,该 Promise 将解析。

然而期望是该delete方法返回刚刚删除的对象,因此我们有一个矛盾。

所以有3种设计选择。

1. 打破delete的工作原理,进行save并返回promise;
2. 让 delete 进行保存,但不是承诺返回已删除的项目;
3. 让delete返回item,让开发者明确地做save​​。

选项 1 和 2 不好,因为这会使删除操作不灵活。

选项 3,虽然打破了 ActiveRecord 的标准语义,但允许在需要时轻松实现这些语义(即通过添加save到末尾)而不牺牲灵活性

于 2019-09-08T03:05:14.940 回答