【发布时间】:2017-05-25 13:28:29
【问题描述】:
我有一个名为 Option 的模型,它具有自引用关联。一个选项可以有多个子选项,一个子选项可以有一个父选项。我还使用 cocoon gem 的嵌套属性在 form_for 选项上创建多个子选项。在表单上创建选项时,我可以动态创建子选项。
视图/选项/_form.html.erb:
<%= form_for @option do |f| %>
<p>
<%= f.label :name %><br>
<%= f.text_field :name %><br>
<%= f.label :activity %><br>
<%= f.select :activity_id, options_for_select(activity_array, @option.activity_id)%><br>
</p>
<div>
<div id="suboptions">
<%= f.fields_for :suboptions do |suboption| %>
<%= render 'suboption_fields', f: suboption %>
<% end %>
<div class="links">
<%= link_to_add_association 'add suboption', f, :suboptions %>
</div>
</div>
</div>
<p>
<%= f.submit "Send" %>
</p>
<% end %>
模型/选项.rb:
class Option < ApplicationRecord
belongs_to :activity
has_many :option_students
has_many :students, through: :option_students
has_many :suboptions, class_name: "Option", foreign_key: "option_id"
belongs_to :parent, class_name: "Option", optional: true, foreign_key: "option_id"
accepts_nested_attributes_for :suboptions, allow_destroy: true,
reject_if: ->(attrs) { attrs['name'].blank? }
validates :name, presence: true
after_initialize :set_defaults
before_update :set_defaults
def set_defaults
self.suboptions.each do |sbp|
sbp.activity_id = self.activity_id
end
end
end
参数:
def option_params
params.require(:option).permit(:name, :activity_id, :students_ids => [], suboptions_attributes: [:id, :name, activity_id, :_destroy])
end
我希望每个子选项在创建和更新时都从父项继承 activity_id 属性。我通过在模型上使用 set_defaults 方法尝试了这种方式,它适用于具有新嵌套子选项的新选项,如果我更新父项的活动 ID,它也会更新子选项的活动 ID。但是如果我在更新时创建另一个子选项,它不会将属性从父项传递给新的子选项。
【问题讨论】:
标签: ruby-on-rails inheritance nested-attributes model-associations self-reference