#ruby-on-rails #ruby #activerecord
#ruby-on-rails #ruby #activerecord
Вопрос:
Как я могу выводить категории и подкатегории в rails View? Вот так:
- Название первой категории
- Имя дочернего элемента первой категории 1
- Имя дочернего элемента первой категории 2
- Имя дочернего элемента первой категории 3
- Название второй категории
- Имя дочернего элемента второй категории 1
- Имя дочернего элемента второй категории 2
- Имя дочернего элемента второй категории 3
моя схема.rb:
create_table "categories", force: :cascade do |t|
t.integer "title"
t.boolean "state", default: true
t.integer "parent_id" # id of parent category
end
мои categories_controller.rb
def show
@category = Category.find(params[:id])
#child categories of current parent category
@child_categories = Category.where(parent_id: @category.id)
#subchild categories of current parent category
@child_categories.each do |category|
@subchild_categories = Category.where(parent_id: category.id)
end
end
мой show.html.erb
<% if @child_categories.any? %>
<ul>
<% @child_categories.each do |child| %>
<li>
<%= child.title %>
<ul>
<% @subchild_categories.each do |subchild| %>
<li><%= subchild.title %></li>
<% end %>
</ul>
</li>
<% end %>
</ul>
<% end %>
Теперь я получаю что-то вроде этого:
- Название первой категории
- Имя дочернего элемента второй категории 1
- Имя дочернего элемента второй категории 2
- Имя дочернего элемента второй категории 3
- Название второй категории
- Имя дочернего элемента второй категории 1
- Имя дочернего элемента второй категории 2
- Имя дочернего элемента второй категории 3
Ответ №1:
#try this:
def show
@category = Category.find(params[:id])
@child_categories = Category.where(parent_id: @category.id)
@subchild_categories = {}
@child_categories.each do |category|
@subchild_categories[category.title] = Category.where(parent_id: category.id)
end
end
#and in view:
<% @child_categories.each do |child| %>
<li>
<%= child.title %>
<ul>
<% @subchild_categories[child.title].each do |subchild| %>
<li><%= subchild.title %></li>
<% end %>
</ul>
</li>
<% end %>
Ответ №2:
Вы можете создать children
метод в вашей Category
модели, который вызывает where(parent_id: id)
, а затем просто использовать его
def self.children
where(parent_id: id)
end
И затем вы можете использовать его для вашего просмотра столько, сколько захотите:
@category.children.each do |child_category|
child_category.children.each do |sub_child_category|
sub_child_category.children.each do |sub_sub_child_category|
// as much as you want to
end
end
end