【发布时间】:2018-05-31 11:56:24
【问题描述】:
我有一个基于 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 的粘贴错误)
【问题讨论】:
标签: ruby-on-rails scope associations