ruby on rails - rails - categorías y subcategorías modelo rieles
ruby on rails pdf (1)
Sin usar ninguna gema, ¿cómo hago esto en los rieles?
categoria principal
Subcategoría
Subcategoría
Subcategoría
categoria principal
Subcategoría
Subcategoría
Subcategoría
categoria principal
Subcategoría
Subcategoría
Subcategoría
Tengo una mesa que consta de | id | nivel1 | nivel2 |
Nivel 1 siendo la categoría principal y Nivel 2 siendo la subcategoría
Me gustaría que se muestre en la vista como arriba.
Después de mirar en internet, todo el mundo parece recomendar el uso de actos como la gema del árbol, pero quiero evitar usarlos porque soy bastante nuevo en los rieles y me gustaría entender cómo hacer las cosas en lugar de recurrir a las gemas .
Su ayuda es muy apreciada.
Modelo:
class Category < ActiveRecord::Base
belongs_to :catalogue
has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy
belongs_to :parent_category, :class_name => "Category"
end
Controlador:
class CataloguesController < ApplicationController
layout ''main''
def index
@cats = Catalogue.all
end
def categories
@cat = Catalogue.find(params[:id])
end
end
Ver:
<ul class="unstyled-list">
<% @cat.categories.order([:level1]).each do |cat|%>
<li><%= cat.level1 %></li>
<li><%= cat.level2 %></li>
<% end %>
</ul>
Cree un modelo que tenga referencias a sí mismo para una subcategoría (o una subcategoría, etc.):
class Category < ActiveRecord::Base
has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id", :dependent => :destroy
belongs_to :parent_category, :class_name => "Category"
end
-
has_many
define una asociación desubcategories
de laCategory
tipo de modelo. Es decir, utiliza la misma tabla. - El
belongs_to
define una relación con la categoría principal (opcional, no es obligatorio)
Para obtener más información sobre asociaciones de modelos, has_many
o belongs_to
, lea la Guía de belongs_to
básicos de asociaciones .
Para crear la tabla usa esta migración:
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :category do |t|
t.string :text
t.references :parent
t.timestamps
end
end
end
Nota : este formato de tabla es (ligeramente) diferente al que propuso, pero supongo que no es un problema real.
La Guía de Migraciones contiene más información sobre las migraciones de base de datos.
En tu controlador usa
def index
@category = nil
@categories = Category.find(:all, :conditions => {:parent_id => nil } )
end
para encontrar todas las categorías sin un padre, es decir, las categorías principales
Para encontrar todas las subcategorías de cualquier categoría dada use:
# Show subcategory
def show
# Find the category belonging to the given id
@category = Category.find(params[:id])
# Grab all sub-categories
@categories = @category.subcategories
# We want to reuse the index renderer:
render :action => :index
end
Para agregar una nueva categoría usa:
def new
@category = Category.new
@category.parent = Category.find(params[:id]) unless params[:id].nil?
end
Crea una nueva categoría y establece el padre, si se proporciona (de lo contrario, se convierte en una categoría principal)
Nota: usé la antigua sintaxis de los rieles (debido a la pereza), pero para Rails 3.2 el principio es el mismo.
En tus categories/index.html.erb
puedes usar algo como esto:
<h1><%= @category.nil? ? ''Main categories'' : category.text %></h1>
<table>
<% @categories.each do |category| %>
<tr>
<td><%= link_to category.text, category_path(category) %></td>
<td><%= link_to ''Edit'', edit_category_path(category) unless category.parent.nil? %></td>
<td><%= link_to ''Destroy'', category_path(category), :confirm => ''Are you sure?'', :method => :delete unless category.parent.nil? %></td>
</tr>
<% end %>
</table>
<p>
<%= link_to ''Back'', @category.parent.nil? ? categories_path : category_path(@category.parent) unless @category.nil? %>
<%= link_to ''New (sub-category'', new_category_path(@category) unless @category.nil? %>
</p>
Muestra el nombre de la categoría seleccionada (o Categoría principal) y todas sus subcategorías (en una tabla agradable). Enlaza a todas las subcategorías, mostrando un diseño similar, pero para la subcategoría. Al final, agrega un enlace ''nueva subcategoría'' y un enlace ''atrás''.
Nota : Mi respuesta se volvió un poco extensa ... Lo copié y modifiqué de uno de mis proyectos que utiliza una construcción similar (para (sub) menús). Así que espero no haber roto nada durante las modificaciones ... :)