我的模型Form
有嵌套对象:form_fields
。 FormField有一个名为sorting
的属性,对于表单应该是唯一的。
class Form < ActiveRecord::Base
has_many :form_fields
accepts_nested_attributes_for :form_fields, allow_destroy: true, reject_if: :all_blank
def max_form_field_sorting
# find and return max value of sorting in nested attributes
end
end
class FormField < ActiveRecord::Base
belongs_to :form
validates_numericality_of :sorting, allow_blank: true, only_integer: true, greater_than: 0
validates :sorting, allow_blank: true, uniqueness: {scope: :form}
end
我想在新FormField附加到表单时为其设置sorting
值。它应该从方法max_form_field_sorting
获取当前最大值(已经工作),并将新FormField的排序设置为该值+1。
问题是有多种方法可以附加新的嵌套对象,有时会在附加到表单之前创建FormField。
form_field_1 = FormField.new
my_form.form_fields << form_field_1
my_form.form_fields.push(FormField.new)
my_form.form_fields = [my_form_1, my_form_2]
FormField.new(form: my_form)
Form.new(form_fields_attributes: {...})
实施该行为的最佳做法是什么?
答案 0 :(得分:1)
理想情况下,我们会在保存Form
之前根据FormField
的最大排序设置排序依据:
class FormField < ActiveRecord::Base
# Your current code
before_save :set_sorting
def set_sorting
self.sorting ||= self.class.where(form_id: form_id).maximum(:sorting).to_i + 1
end
end
所以我们只设置sorting
,如果没有指定。