Hola a todos,
Llevo unos dias peleandome con unas relaciones un tanto atipicas y no
doy con la solución.
Necesito representar una especie de arbol donde un nodo puede tener
varios hijos y varios padres, por lo que acts_as_tree no me vale. Lo
estoy haciendo mediante has_many :through porque ademas cada relación
debe guardar algunos datos mas.
Los modelos que estoy usando son:
class Category < ActiveRecord::Base
has_many :parents, :class_name => ‘Relationship’
has_many :children, :class_name => ‘Relationship’, :foreign_key =>
‘parent_id’
has_many :categories, :through => :relationships
end
class Relationship < ActiveRecord::Base
belongs_to :category
belongs_to :category, :foreign_key => “parent_id”
end
y las migraciones contienen:
class CreateCategories < ActiveRecord::Migration
def self.up
create_table :categories do |t|
t.string :name
t.timestamps
end
Category.create :name => “A”
Category.create :name => “B”
Category.create :name => “C”
Category.create :name => “D”
Category.create :name => “E”
end
def self.down
drop_table :categories
end
end
class CreateRelationships < ActiveRecord::Migration
def self.up
create_table :relationships do |t|
t.integer :category_id
t.integer :parent_id
t.timestamps
end
Relationship.create :category_id => 2, :parent_id => 1
Relationship.create :category_id => 3, :parent_id => 1
Relationship.create :category_id => 2, :parent_id => 3
Relationship.create :category_id => 5, :parent_id => 1
Relationship.create :category_id => 4, :parent_id => 5
Relationship.create :category_id => 2, :parent_id => 5
end
def self.down
drop_table :relationships
end
end
Entonces cuando desde una consola hago, por ejemplo:
Category.find(:first).children
Me muestra objetos de la clase Relationship en los que la categoria con
id 1 esta como parent_id, cuando creo que deberia de mostrar objetos de
la clase Category que son los hijos, en otras palabras me muestra
registros de la tabla relationships en lugar de registros de la tabla
categories.
1- ¿A que se debe esto?, seguro que me he equivocado en algo al definir
las relaciones en los modelos pero al utilizar dos veces el mismo modelo
estoy perdiendo la cabeza.
2- ¿Como deberia de definir un metodo para que cuando pregunte por
padres no solo me muestre los padres/hijos directos, sino también toda
la rama hacia arriba/abajo?
3- ¿Existe algún plugin como acts_as_tree que me permita hacer esto y me
estoy volviendo loco por gusto?
Saludos y gracias!