Criando um plugin
Posted on September 27, 2006
Como testamento à facilidade do Rails, resolvi testar a criação de um plugin implementando um algoritmo conhecido no mundo de bancos de dados relacionais.
É o problema de como mapear uma estrutura de árvore para uma tabela
relacional. Normalmente as pessoas implementam como o que chamamos de “Adjacent List”, ou seja, uma tabela com uma foreign key voltando para ela mesma, de forma que podemos pegar alguns níveis da árvore usando um self join.
Mas essa solução, além de não ser performática, é muito pouco prática para criar queries e operações.
Uma solução mais elegante foi descrita por Joe Celko, o que foi chamado de “Nested Set”. Ela permite uma estrutura sem foreign keys. Cada nó da árvore, em vez de um ponteiro, guarda duas bordas numérica. Por exemplo, se um nó tem a borda esquerda numerada como 1 e a direita como 10, podemos encontrar os nós abaixo usando um simples BETWEEN de bordas. Ou seja, podemos achar os nós 2-3, 4-5, 6-7, 8-9, por exemplo.
Vocês podem testar isso no seu próprio projeto usando o seguinte comando dentro do seu projeto Rails:
Ela irá criar uma nova pasta chamada acts_as_nested_set dentro da pasta vendor/plugins do seu projeto.
Em seguida, leia a documentação que descreve onde encontrar a teoria do algoritmo e siga as intruções presentes no código fonte acts_as_nested_set.rb, ela irá dar as direções para criar a tabela no formato correto dentro no banco de dados. No seu model basta colocar a diretiva “acts_as_nested_set” e pronto, ela já estará automaticamente habilitada a realizar operações de árvore.
Divirtam-se.
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




