我有一个模型付款,它有许多PaymentItems,其中每个付款项目与一个项目相关联。
class Payment < ActiveRecord::Base
has_many :payment_items, inverse_of: :payment
has_many :items, through: :payment_items
accepts_nested_attributes_for :payment_items, reject_if: ->(payment_item_attributes) { payment_item_attributes['item_id'].blank? }
...
end
class PaymentItem < ActiveRecord::Base
belongs_to :tab_item, inverse_of: :payment_item
belongs_to :payment, inverse_of: :payment_items
... validations ...
end
在我的付款表单中,我在迭代可用商品时为每个PaymentItem使用了fields_for方法。
= form_for @payment do |f|
- @tab_items.each do |item|
= f.fields_for :payment_items, @payment.payment_items.find_or_initialize_by(item_id: item.id) do |payment_item_form|
%label
= payment_item_form.check_box :item_id, item.id, nil
= item.name
还有更多的嵌套用于收集有关验证的payment_item的更多信息,但如果验证失败,则find_or_initialize_by方法无法按item_id查找项目。
我的问题是:在案例验证失败的情况下,find_by是否可以在未使用的嵌套模型上工作?我现在的工作是做类似的事情:
@payment.payment_items.select {|i| i.tab_item_id == item.id } || @payment.payment_items.new(tab_item: item)
但感觉笨重。
感谢您的帮助。