Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 简单的树形式多对多关联?_Ruby On Rails_Ruby On Rails 4_Simple Form - Fatal编程技术网

Ruby on rails 简单的树形式多对多关联?

Ruby on rails 简单的树形式多对多关联?,ruby-on-rails,ruby-on-rails-4,simple-form,Ruby On Rails,Ruby On Rails 4,Simple Form,我试图构建一个UI来更新与另一个模型(“类别”)有多对多关系的模型(“概要”)。“类别”模型对于“子类别”本身具有自指关系 在我的simple_表单中,我希望将类别显示为复选框,并将其子类别嵌套在下面作为复选框 在我当前的代码中,我只有以下关联字段: = f.association :categories, as: :check_boxes, collection: @categories 我只是将顶级类别检索到变量@categories中 我不知道接下来该怎么办。最好的方法是什么?祖先 在使

我试图构建一个UI来更新与另一个模型(“类别”)有多对多关系的模型(“概要”)。“类别”模型对于“子类别”本身具有自指关系

在我的simple_表单中,我希望将类别显示为复选框,并将其子类别嵌套在下面作为复选框

在我当前的代码中,我只有以下关联字段:

= f.association :categories, as: :check_boxes, collection: @categories
我只是将顶级类别检索到变量@categories中


我不知道接下来该怎么办。最好的方法是什么?

祖先

在使用
祖先
gem之前,我们已经这样做了:

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

相反,我们所做的是首先雇佣
祖先
gem,然后使用
部分
助手
获得嵌套的下拉影响:

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

下拉列表

#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

嗨,里奇。谢谢你的回答。我没有太多地看祖先宝石,所以这是好的。唯一的问题是我需要在我的表单中进行多个选择,这就是为什么我想使用复选框而不是下拉列表。您认为使用复选框可以将相同的方法应用于多个选择吗?多个复选框是否相互依赖?也就是说,如果您选中复选框1,复选框2将更新以反映新的更改?不,您将分别选择每个复选框。好的-那么复选框1中会有什么内容,而不是复选框2?好的,再仔细考虑一下。如果选择了“子类别”,则必须自动选择父类别。但如果选择了父类别,则不会自动选择父类别的所有子类别。不过,最主要的是能够以某种方式显示其层次结构中的类别,以便可以进行多项选择。
#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)