2016-04-07 5 views
1

Если вы хотите сразу перейти к вопросу, просто перейдите к последнему абзацу.Сбой вложенных атрибутов в родительской ассоциации

A Pack содержит много предметов, элемент является полиморфным, а одна из связанных таблиц - Access (поэтому Access - это элемент, который можно добавить в пакет) Здесь вы модели и контроллер.

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 

Существует importan проверки в пакете «valid_max_value. Если пакет имеет бесконечный доступ внутрь, max_value стаи никогда не должна быть выше, чем 1. Он отлично работает, когда я создаю пакет и добавить некоторые Допуски, но проблема заключается в следующем:

  • у меня есть пакет с двумя пунктами доступ, который бесконечен и общий доступ (не бесконечный) Так max_value паковом должен быть 1, поскольку она имеет бесконечный доступ внутрь.. .
  • Теперь я редактирую этот пакет, и я удаляю бесконечный доступ, поэтому теперь могу выберите более высокое значение max_value, например, 5, потому что у пакета нет доступа с ограничением внутри.
  • Когда я нажимаю update, происходит откат, потому что проверка valid_max_value выполняется до удаления бесконечного Access, поэтому он говорит, что max_value является недопустимым, поскольку проверка зависит от дочернего поля.

Короче говоря, мой вопрос: Как я могу удалить вложенные элементы перед запустить родительские проверки?

ответ

1

Вы не должны действительно удалить элементы перед проверкой, проверьте marked_for_destruction? вместо этого в ваших валидаций, так что элементы, которые должны быть удалены, будут игнорироваться

+0

Круто! это отличный подход. Но теперь, как я могу использовать его правильно? потому что это ассоциация has_many, и она отмечает для уничтожения pack_item вместо элемента, необходимого для проверки. Я могу закодировать его, чтобы получить элемент из отношения, но я хотел бы знать, что есть лучший способ. – Quin

+0

@ Вокруг моей головы, это путь. – Vasfed