simple_form多对多关联为树?

时间:2014-07-06 03:51:45

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

我正在尝试构建一个用于更新模型的用户界面(" Profile"),该模型与另一个模型有多对多关系("类别")。 "类别"对于"子类别"。

,模型与其自身具有自我参照关系

在我的simple_form中,我想将类别显示为复选框,其子类别嵌套在它们下面作为复选框。

在我目前的代码中,我所拥有的只是关联字段:

= f.association :categories, as: :check_boxes, collection: @categories

我只是将顶级类别检索到变量@categories。

我不知道从哪里开始。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

<强>祖先

我们在使用ancestry gem:

之前已经完成了这项工作

enter image description here

enter image description here

您遇到的问题是您的自引用关联不会为您提供创建“真实”嵌套下拉列表所需的范围;它必须能够考虑所有嵌套数据。

相反,我们所做的是首先雇用ancestry gem,然后使用partialhelper获取嵌套下拉列表效果:

#app/models/category.rb
Class Category < ActiveRecord::Base
   has_ancestry
end

enter image description here


<强>显示

如果您存储这样的相关数据,它允许您创建基于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)