ruby-on-rails - مطاطية - كيفية عمل قائمة منسدلة مفلترة




عرض الفئات/الفئات الفرعية في التسلسل الهرمي للأشجار داخل القائمة المنسدلة (2)

على افتراض يمكنك الحصول على الأطفال من فئة معينة مماثلة ل:

has_many :children, :class_name => 'Category', :foreign_key => 'parent_id'

إنشاء طريقة للفئات للحصول على جميع الأطفال والمسافة البادئة كل حسب المستوى:

def all_children2(level=0)
    children_array = []
    level +=1
    #must use "all" otherwise ActiveRecord returns a relationship, not the array itself
    self.children.all.each do |child|
      children_array << "&nbsp;" * level + category.name
      children_array << child.all_children2(level)
    end
    #must flatten otherwise we get an array of arrays. Note last action is returned by default
    children_array = children_array.flatten
end

ثم في وجهة نظركم:

<select>
    <option></option>
    <% root_categories.each do |category| %>
      <option><%=category.name%></option>
      <% category.all_children2.each do |child| %>
        <option><%=child.html_safe%></option>
      <% end %>
    <% end %>
</select>

لم أكن 100٪ اختبار هذا ولكن بت أنا أقترح أنه ينبغي أن تعمل ...

لدي جدول فئة مع الحقول إد، اسم و parent_id. فئات الجذر لها parent_id 0. الآن أريد إظهار قائمة الفئات في القائمة المنسدلة وبنية مثل هذا:

root_category
    first_sub_category
        sub_sub_category
        another_sub_sub_category
    second_sub_category
another_root_category
    first_sub_category
    second_sub_category

وهنا المراقب بلدي:

def new
  @category = Category.new
end   

وهنا الرأي:

    <%= f.label :parent_category %>
    <% categories = Category.all.map{|x| [x.name] + [x.id]} %>
    <%= f.select(:parent_id, options_for_select(categories), {}, class: 'form-control') %>

الرجاء المساعدة.


حل المشكلة عن طريق إضافة هذه الوظائف في application_helper.rb

def subcat_prefix(depth)
  ("&nbsp;" * 4 * depth).html_safe
 end

 def category_options_array(current_id = 0,categories=[], parent_id=0, depth=0)
  Category.where('parent_id = ? AND id != ?', parent_id, current_id ).order(:id).each do |category|
      categories << [subcat_prefix(depth) + category.name, category.id]
      category_options_array(current_id,categories, category.id, depth+1)
  end

  categories
end

واستخدامها في وجهة نظري مثل هذا

<%= f.select(:parent_id, options_for_select(category_options_array), {}, class: 'form-control') %>




gem