2016-04-07 18 views
1

質問に直接進む場合は、最後の段落に移動してください。ネストされた属性の検証は親の関連付けで失敗します

パックには多くのアイテムが含まれています。アイテムはポリモーフィックで、リンクされたテーブルの1つはアクセスです(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より高くなることはありませんいくつかのアクセス数が、問題はこれです:私は2つのアイテムとのパックを持って

  • 無限のアクセスと共通アクセス(無限ではない)、それは内部の無限のアクセスを持っているので、パックのMAX_VALUEは1でなければなりませんので。
  • このパックを編集して無限アクセスを削除しました。パックには制限があるAccessが含まれていないため、max_valueの上位5つを選択します(例では5)。
  • updateをクリックすると、valid_max_value検証が無限アクセスの削除より前に実行されるためロールバックが行われるため、検証は子フィールドに依存するため、max_valueは無効です。要するに

、私の質問はです:親の検証を実行する前に、どのように私は、ネストされた項目を削除することができますか?

答えて

1

削除される項目は

+0

クールに無視されるように、あなたは、あなたの検証に代わりmarked_for_destruction?をチェックし、実際に検証する前に項目を削除する必要はありません!それは素晴らしいアプローチです。しかし、今私はそれをどのように適切に使うことができますか?それはhas_many関連を持つため、検証に必要な項目の代わりにpack_itemを破棄するためのマークです。私は関係からアイテムを取得するためにそれをコーディングすることができますが、もっと良い方法があることを知りたいと思います。 – Quin

+0

@Quinは私の頭の上から離れて行く方法です。 – Vasfed

関連する問題