添加时在嵌套模型中设置依赖属性

时间:2016-02-23 15:08:59

标签: ruby-on-rails ruby-on-rails-4

我的模型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: {...})

实施该行为的最佳做法是什么?

1 个答案:

答案 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,如果没有指定。