02
Fev 09
  • O problema: Fazer um relacionamento entre links, tags e users.
  • Um usuário possui vários links e um link pertence a vários usuários. Os links (urls) não podem ser duplicados no banco.
  • Um usuário associa várias tags aos seus links e uma tag pertence a vários usuários.
  • Detalhe: se o link dessaonrails.blogs.sapo.pt possui as tags rails e ruby, eu preciso saber exatamente qual usuário salvou a tag rails e ruby.

Inicialmente, imaginamos uma tabela tripla, com user_id, link_id e tag_id. Parti deste princípio e tenter montar um relacionamento que me permitisse utilizar a tabela tripla. A solução adotada foi baseada na solução proposta neste blog e pode ser vista nesta discussão. Porém, a coisa não tava muito boa.

Dai hoje, 2h da matina (imaginem, eu tinha aula as 7h), estava eu pensando em uns before_save e before_destroy que queria fazer na aplicação. Mas tudo que eu pensava não encaixava.. Tipo não tinha lógica e tudo que tava feito começou a me parecer gambiarra feiaaa. O relacionamento simplesmente não tava deixando a energia (programação) do troço fluir naturalmente.

Aííí (calma, já já chego na solução), eis que comecei a pensar novamente, escrever algumas coisas no papel e de repente vejo que escrevi "nossa vei, não acredito". Eu tinha descoberto um jeito muito mais correto, muito mais bonito e muito mais banal de simples de fazer aquela complicação toda! Não acreditei! É muito simples, muitoo! Segue:

Partindo do principio de que cada link possui detalhes nos quais cada usuário pode escrever o que quiser (como titulo, descrição, etc), então um detalhe de link diz respeito somente a um link e a um usuário (entao ele é a tabela de relacionamento users_links mais alguns campos desse relacionamento!). Para facilitar, chamei esse "detalhe" de bookmark e tudo ficou muito simples, muito banal e - como diria um professor meu - ficou absurdamente retardadoooooo de banal de fácil (sim, ainda estou chocada):

user has_many links through bookmarks
user has many bookmarks
(usuario pode salvar varios detalhes de links)

link has many bookmarks
(um mesmo link possui varios detalhes diferentes, cada um salvo por um user)

link has many users through bookmaks

bookmark belongs to user
bookmark belongs to link


Para incluir as tags eu ainda vou dar uma olhada do act_as_taggable, mas poderia adicionar assim:

bookmark has and belongs to many tags (o link salvo pelo usuario possui varias tags)
tag has and belongs to many bookmarks
(uma tag pode aparecer em varios bookmarks diferentes)

e o resultado em tabelas seria:

users, links, bookmarks (com user_id e link_id), bookmarks_tags, tags.

* sempre que um usuario for salvar um link ele cria um bookmark. *

Ufa.

publicado por dessa às 14:22

Dezembro 2009
Dom
Seg
Ter
Qua
Qui
Sex
Sab

1
2
3
4
5

6
7
8
9
10
11
12

13
14
15
16
17
18
19

20
21
22
23
24
25
26

27
28
29
30
31


posts recentes

On/Off

pesquisar
 
Subscrever por e-mail

A subscrição é anónima e gera, no máximo, um e-mail por dia.

blogs SAPO