Ruby on Rails: это правильно, как я кодировал свое дерево категорий (это как рубин?) - PullRequest
0 голосов
/ 21 января 2012

Я новичок в 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

Это рубиновый способ кодирования, могу ли я сократить или изменить что-тополностью?Спасибо за вашу помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...