Nessa semana meu chefe me pediu para fazer umas tabelas novas no projeto da empresa, e que tinha uma tabela que tinha que relacionar com si mesma, algo bem complexo, mas como sempre, no Rails isso é bastante fácil de se fazer.
Vamos usar como exemplo o velho e bom blog, onde temos categorias e cada categorias, podem ter categorias filhas. Ai teremos um AUTO-RELACIONAMENTO.
Vamos lá:
1 | rails new blog |
Criando o migrations:
1 | rails g migration categories |
Abra o arquivo db/migrate/TIMESTAMP_categories.rb e edite dessa maneira:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class CreateCategories < ActiveRecord::Migration def self.up create_table :categories do |t| t.column :father_id, :integer, :references => :categories t.column :name, :string t.column :description, :string t.timestamps end end def self.down drop_table :categories end end |
Agora criaremos a nossa tabela no banco:
1 | rake db:create && rake db:migrate |
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, então abriremos o arquivo app/model/categories.rb e editaremos da seguinte forma:
1 2 3 4 | 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.
Bem é isso ai!
