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は無効です。要するに
、私の質問はです:親の検証を実行する前に、どのように私は、ネストされた項目を削除することができますか?
クールに無視されるように、あなたは、あなたの検証に代わり
marked_for_destruction?
をチェックし、実際に検証する前に項目を削除する必要はありません!それは素晴らしいアプローチです。しかし、今私はそれをどのように適切に使うことができますか?それはhas_many関連を持つため、検証に必要な項目の代わりにpack_itemを破棄するためのマークです。私は関係からアイテムを取得するためにそれをコーディングすることができますが、もっと良い方法があることを知りたいと思います。 – Quin@Quinは私の頭の上から離れて行く方法です。 – Vasfed