Isso deve ser um Has_Many: através da associação?
-
23-09-2019 - |
Pergunta
Uma postagem pertence a um usuário, e um usuário possui postagens.
Uma postagem também pertence a um tópico, e um tópico possui postagens.
class User < ActiveRecord::Base
has_many :posts
end
class Topic < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :topic
end
Bem, isso é bastante simples e muito fácil de configurar, mas quando exibo um tópico, não apenas quero todas as postagens para esse tópico, mas também o user_name e o user_photo do usuário que fizeram essa postagem. No entanto, esses atributos são armazenados no modelo de usuário e não estão vinculados ao tópico. Então, como eu iria configurar isso?
Talvez já possa ser chamado, já que o modelo de post tem duas chaves estrangeiras, uma para o usuário e outra para o tópico?
Ou, talvez isso seja algum tipo de "unidirecional" tem_many através da assiociação. Como a postagem seria o modelo de junção, e um tópico teria_many: usuários :: through =>: posts. Mas o inverso disso não é verdadeiro. Como um usuário não tem_many: tópicos.
Então, isso precisaria ser Has_Many: Embora a associação? Acho que estou um pouco confuso sobre como seria o controlador chamar a postagem e o usuário dessa postagem para um tópico de dar.
EDIT: Sério, obrigado a tudo o que pesa. Eu escolhi a resposta de Tal porque usei o código dele para o meu controlador; No entanto, eu poderia ter escolhido com a mesma facilidade J. ou Tim. Obrigado a ambos também. Isso foi tão simples de implementar. Acho que hoje pode marcar o começo do meu caso de amor com Rails.
Solução
Bem, se o que você deseja é exibir o nome de usuário do autor de uma postagem, por exemplo, você pode fazer algo como (não testado, mas deve funcionar):
@posts = topic.posts.all(:include => :user)
Ele deve gerar uma solicitação para todas as postagens e outra para usuários, e a coleção de postagens deve ter usuários.
Em uma visão (Haml aqui):
- @posts.each do |post|
= post.user.name
= post.body
Outras dicas
você pode obter o user_name
e user_photo
Ao exibir um tópico e suas postagens ...
algo como:
@topic.posts.each do |post|
user_name = post.user.name
user_photo = post.user.photo
end
é simples. Desculpe se não entendi muito bem sua pergunta.
Se eu entender sua pergunta corretamente, não, um Has_Many: Através da associação não é necessário aqui.
Se você quisesse exibir uma lista de todos os usuários que postaram em um tópico (pulando as informações da postagem), seria útil.
Você deseja carregar os usuários de postagens, porém, para evitar consultas N+1.