Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tacno

Problema com Joins na hora de printar na tela.

Recommended Posts

Olá!
Estou fazendo uma query que mostra a postagem da matéria e estou utilizando o método .find() com dois inner joins.

A query está assim:

@post = Post.find(:first,
      :select => 'posts.imagem, posts.titulo, posts.texto, posts.tags, categoria.categoria, usuarios.usuario, usuarios.nome, usuarios.assinatura',
      :joins => 'INNER JOIN usuarios ON usuarios.usuarioid = posts.usuario INNER JOIN categoria ON categoria.categoriaid = posts.categoria',
      :conditions => 'posts.url LIKE "%' + param + '%"',
      :limit => '1'
    )

Estou selecionando os campos. O problema que estou tendo é:
Na tabela postagem eu tenho o campo categoria, que está linkado com a tabela categoria atavés do categoriaid.

Ou seja:
posts.categoria = categoria.categoriaid

Fiz essa query, no select deixo claro que quero o categoria.categoria (que é o nome da categoria) e ele retorna 0 quando executo o código.

<%= @post.categoria %> <!-- Retorna 0. -->

Outra coisa. Como eu tenho valores duplicados nas tabelas. Ex:

posts.categoria # Id da categoria

categoria.categoria # nome da categoria

 

Caso eu precisasse dos dois, como deveria agir?

 

Como faço para printar os dois campos inseridos na query??

 

Desde já agradeço.

Tacno

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri algo.

Se eu fizer apenas um INNER JOIN, funfa!

Se eu colocar os dois, num funfa mais!! Como faço multiplos joins?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Opa,


Primeira pergunta: você está utilizando Rails?


Segunda: você pode postar como estão suas tabelas e models?


Bom, supondo que esteja utilizando Rails... Pelo que vi, começando pela sua segunda pergunta, está mal modelado isto. Uma dica seria criar um migrate para modelar as tabelas da maneira convencional, utilizando o campo categoria_id como chave estrangeira na tabela post, e trocar categoria.categoria por categoria.nome.


Já sobre sua pergunta, a maneira de recuperar o nome da categoria neste seu modelo seria



@post.categoria.categoria



Como você está recuperando apenas um post, seu select é um pouco desnecessário, se seus models estiverem associados, você poderia fazer:




@post = Post.where("posts.url like '%#{param}%'")



E quando chamar @post.categoria ou @post.usuario, o rails já faz a query necessária para recuperar estes dados. Como são querys básicas, buscando diretamente a chave primária, sua performance não irá sofrer danos e seu código ficará mais limpo.



Outra coisa que pode fazer seria alterar sua query para algo como



@post = Post.find(:first,
:select => 'posts.imagem, posts.titulo, posts.texto, posts.tags, categoria.categoria as categoria_nome, usuarios.usuario, usuarios.nome, usuarios.assinatura',
:joins => 'INNER JOIN usuarios ON usuarios.usuarioid = posts.usuario INNER JOIN categoria ON categoria.categoriaid = posts.categoria',
:conditions => 'posts.url LIKE "%' + param + '%"',
:limit => '1'
)



E então recuperar a categoria como



@post.categoria_nome



Mas se estiver utilizando Rails, recomendo que utilize Rails, não apenas o framework, mas as convenções pois o framework é justamente em cima disto. "Convention over configuration".

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.