Я новичок в Rails и только что получил свое дерево категорий.Теперь я не уверен, что то, что я сделал, это «ruby-конформ» или «ruby-like».Я пришел из PHP и должен изменить некоторые свои привычки, но это нелегко.Я просто хочу проверить, нахожусь ли я на правильном пути.
Структура сделана командой scaffold, поэтому я думаю, что это правильно.Таким образом, существует модель-класс, которая называется Category и наследуется от ActiveRecord :: Base.Эта модель имеет следующие атрибуты / поля базы данных:
* id, media, image, small_image, клики, родитель, active, описание, имя, create_at, updated_at *
Это содержимоемой модельный класс:
class Category < ActiveRecord::Base
has_many :articles,
:foreign_key => 'category'
belongs_to :parent_object,
:foreign_key => "parent",
:class_name => "Category"
has_many :children,
:foreign_key => "parent",
:class_name => "Category",
:order => "name ASC",
:dependent => :delete_all
@tree = Hash.new
@treepart = Hash.new
def self.category_tree
@root_categories = self.find(:all, :conditions => ["parent = ?", 0])
if @root_categories.length >= 1
@root_categories.each do |level|
@tree[level.id] = level.child_loop(level)
end
@tree
end
end
def child_loop(child)
@treepart = { :category => child }
@treepart[:children] = Hash.new
child.children.each do |child|
@treepart[:children][child.id] = child.child_loop(child)
end
@treepart
end
end
Категории могут быть вложенными, поэтому я интегрировал функции, относящиеся к собственным_ответам и has_many.Я позвонил родителю *: parent_object *, потому что только : parent не работает.Возможно, это конфликтует с атрибутом name.
В модели я собираю все категории с помощью методов * category_tree * и * child_loop *.После этого вызова я получаю изображение дерева категорий в виде хэша.
Category.category_tree
Я делаю это прямо в Articles´ * _form.html.erb * и передаю его моему помощнику, которыйГенерация HTML.Вот вызов из шаблона from:
<%= build_category_tree(Category.category_tree).html_safe %>
Помощник выполняет рендеринг следующим образом:
module CategoriesHelper
def build_category_tree(object_tree)
tree = object_tree
@treestring = "<ul>" + self.level_loop(tree) + "</ul>"
end
def level_loop(level)
@levelstring = ''
if !level.nil?
level.each do |id,item|
if item.has_key?(:category) && !item.nil?
@levelstring += "<li>" + item[:category].name + "</li>"
@levelstring += "<ul>" + self.level_loop(item[:children]) + "</ul>"
end
end
end
# in the end, return string to prevent a nil return
@levelstring += ""
end
end
Это рубиновый способ кодирования, могу ли я сократить или изменить что-тополностью?Спасибо за вашу помощь