Auto-relacionamento em Rails

Posted March 19th, 2009 in Desenvolvimento by felipepavao

Finalmente o primeiro post sobre Rails. Essa dica é muito legal e prática para quem quer fazer auto-relaciomento com Rails. Estou postando porque não foi tão fácil encontrar a solução. Para facilitar, vamos exemplificar:

Vamos supor que em nosso sistema (um blog, por exemplo) temos categorias. E categorias podem possuir categorias filhas. Temos aí um auto-relacionamento para fazer, certo ?

No Rails, isso é muito fácil. No esquema das migrations, deveríamos ter algo parecido com isso:

class CreateCategories < ActiveRecord::Migration
  def self.up
    create_table :categories do |t|
      t.string :name
      t.string :description
      t.integer :father_id
	end
  end
 
  def self.down
    drop_table :categories
  end
end

A coluna father_id indica a o ID de uma categoria pai. Seria como uma Foreign Key. Agora precisamos definir o relacionamento no Model para que o Rails possa compreender a tabela que criamos.

class Category < ActiveRecord::Base
	has_many :children, :class_name => "Category", :foreign_key => "father_id"
	belongs_to :father, :class_name => "Category"
end

Essas duas linhas de código significam o seguinte:

  • A primeira linha, indica que Category tem filhos, utilizando o Model Category e chave estrangeira father_id;
  • A segunda linha diz que o mesmo Model Category pertence a um Category, estabelecendo aí o auto-relacionamento.

A partir daí, você já pode brincar e descobrir os filhos de um Category pai usando @category.children. Para descobrir o pai de um Category, use @category.father.

Para quem quiser aprender mais sobre relacionamentos no Rails, acesse o Guia Rails, ainda na versão em Inglês.  Em breve haverá uma versão em português. Assim que sair eu anunciarei por aqui.