我正在尝试构建一个用于更新模型的用户界面(" Profile"),该模型与另一个模型有多对多关系("类别")。 "类别"对于"子类别"。
,模型与其自身具有自我参照关系在我的simple_form中,我想将类别显示为复选框,其子类别嵌套在它们下面作为复选框。
在我目前的代码中,我所拥有的只是关联字段:
= f.association :categories, as: :check_boxes, collection: @categories
我只是将顶级类别检索到变量@categories。
我不知道从哪里开始。这样做的最佳方式是什么?
答案 0 :(得分:2)
<强>祖先强>
我们在使用ancestry
gem:
您遇到的问题是您的自引用关联不会为您提供创建“真实”嵌套下拉列表所需的范围;它必须能够考虑所有嵌套数据。
相反,我们所做的是首先雇用ancestry
gem,然后使用partial
和helper
获取嵌套下拉列表效果:
#app/models/category.rb
Class Category < ActiveRecord::Base
has_ancestry
end
<强>显示强>
如果您存储这样的相关数据,它允许您创建基于partial
的嵌套效果:
#app/views/admin/categories/index.html.erb
<%= render partial: "category", locals: { collection: collection } %>
#app/views/categories/_category.html.erb
<!-- Categories -->
<ol class="categories">
<% collection.arrange.each do |category, sub_item| %>
<li>
<!-- Category -->
<div class="category">
<%= link_to category.title, edit_admin_category_path(category) %>
<%= link_to "+", admin_category_new_path(category), title: "New Categorgy", data: {placement: "bottom"} %>
</div>
<!-- Children -->
<% if category.has_children? %>
<%= render partial: "category", locals: { collection: category.children } %>
<% end %>
</li>
<% end %>
</ol>
<强>下拉强>
#app/helpers/application_helper.rb
Class ApplicationHelper
def nested_dropdown(items)
result = []
items.map do |item, sub_items|
result << [('- ' * item.depth) + item.name, item.id]
result += nested_dropdown(sub_items) unless sub_items.blank?
end
result
end
end
这将允许您致电:
= f.input :categories, as: :select, collection: nested_dropdown(@categories)