如果您想直接回答问题,请转到最后一段。
包中包含许多项,Item是多态的,其中一个链接表是Access(因此Access是可以添加到包中的Item) 在这里,你是模特和控制器。
class Pack < ActiveRecord::Base
has_many :pack_items, dependent: :destroy
has_many :items_included, through: :pack_items, source: :item
accepts_nested_attributes_for :pack_items, allow_destroy: true
validate :valid_max_value, if: :infinite_item?
end
class Item < ActiveRecord::Base
has_many :pack_items, dependent: :restrict_with_error
has_many :packs, through: :pack_items
end
class Access < ActiveRecord::Base
has_one :item, as: :itemable, dependent: :destroy
has_one :entitlement, as: :entitlementable, dependent: :destroy
accepts_nested_attributes_for :item, allow_destroy: true
accepts_nested_attributes_for :entitlement, allow_destroy: true
validate :valid_max_value, if: :infinite?
private
def infinite?
entitlement.infinite
end
end
class PacksController < BaseController
def update
@pack = Pack.find(params[:id])
if @pack.update(permitted_params)
...
end
end
private
def permitted_params
params.require(:pack).permit(item_attributes: [:id, :name, :max_purchasable],
pack_items_attributes: [:id, :item_id, :amount, :_destroy])
end
end
pack“valid_max_value”中有一个importan验证。如果一个包内部有无限的Access,则Pack的max_value绝不应高于1。 当我创建一个包并添加一些访问时,它工作得很好,但问题是:
简而言之,我的问题是:如何在运行父验证之前删除嵌套项?
答案 0 :(得分:1)
您无需在验证前实际删除项目,请在验证中检查marked_for_destruction?
,以便忽略要删除的项目