ruby-on-rails - Rails:作用域关联上的删除行为与仅从关联中删除不同
问题描述
我有一个基于 Rails 4.2 的项目。
我已经定义了两个这样的模型:
class Option < ActiveRecord::Base
has_many :item_options
has_many :items, through: :item_options, source: :item
scope :materials, -> { where(category: 'material') }
scope :types, -> { where(category: 'type') }
class Item < ActiveRecord::Base
has_many :item_options
has_many :options, through: :item_options
我无法通过 Option 模型的范围删除关联的加入记录。
如果我做:
Item.first.options.materials.delete_all
执行的查询是:
DELETE FROM "options" WHERE "options"."id" IN (SELECT "options"."id" FROM "options" INNER JOIN "item_options" ON "options"."id" = "item_options"."option_id" WHERE "item_options"."item_id" = $1 AND "options"."category" = $2)
这从 Option 模型中删除了记录,这不是我所期望的。
如果我尝试在不使用范围的情况下删除关联记录,如下所示:
Item.first.options.delete_all
正确执行查询:
DELETE FROM "item_options" WHERE "item_options"."item_id" = $1
有效地仅删除连接记录。
如果通过范围调用,为什么 delete 的行为会有所不同?
(已编辑,其中一个模型包含旧名称 LabelItem 的粘贴错误)
解决方案
当您materials
在options
关系中调用该方法时,它会返回一个Option
关系实例。这就是为什么它不起作用。
它可能有效:
class Item < ActiveRecord::Base
has_many :item_options
has_many :options, through: :item_options
has_many :material_options, -> { materials }, through: :item_options, source: :option
然后:
Item.first.material_options.delete_all
推荐阅读
- open-liberty - 重复调用 OpenLiberty MP Config 示例 getProperties()
- javascript - 更新Vue组件数据中的数组
- vue.js - vue单文件组件导入scss intellisense
- maven - H2 控制台在我的笔记本电脑上找不到实体,但可以在其他人身上找到
- javascript - 我在使用 JavaScript 的手风琴时遇到问题
- android - 反应本机 fbsdk 构建错误找不到方法实现()
- html - 使用 rvest 将复杂的 html 文件读入 R
- emacs - Emacs模式函数参数类型不一致
- python - 如何使用 Django 通道对 AsyncConsumer 进行多线程处理
- firefox - 为什么此代码在控制台中有效,但在 WebExtensions 中无效?