0 votes

Refaire cette boucle par utilisateur ?

Je me demande s'il existe une meilleure pratique pour ce que j'essaie d'accomplir...

Tout d'abord, nous avons les modèles categories, categories, has_many posts.

Supposons maintenant que les utilisateurs ajoutent des messages.


J'ai une page sur laquelle je veux afficher uniquement les messages de l'utilisateur actuel par catégorie.


Supposons que nous ayons les catégories suivantes : A, B et C

L'utilisateur 1 s'est inscrit dans les catégories A et B.


Pour ma part, j'ai quelque chose comme.. :

<% @categories.select {|cat| cat.posts.count > 0}.each do |category| %>
  <%= category.name %><br/>
  <% category.posts.select {|post| post.user == current_user}.each do |post| %>
    <%= post.content %><br/>
  <% end %>
<% end %>

La plupart du temps, il y est presque parvenu. Le problème est qu'il affiche toujours une catégorie vide si aucun message n'a été saisi dans cette catégorie (même si l'utilisateur actuel n'a pas saisi de messages dans cette catégorie).

La question se résume donc à :

Comment faire en sorte que la boucle suivante ne compte que les messages de l'utilisateur actuel dans la catégorie ?

<% @categories.select {|cat| cat.posts.count > 0}.each do |category| %>

Meilleur, Elliot

1voto

j.. Points 5862

Je ferais quelque chose comme :

class User < ActiveRecord::Base
   has_many :posts
   has_many :categories, :through => :posts, :uniq => true
end

class Post < ActiveRecord::Base
   belongs_to :user
end

class Category < ActiveRecord::Base
   has_many :posts
end

# controller
@categories = current_user.categories

# view
<% @categories.each do |category| %> 
  <%= category.name %><br/> 
  <% category.posts.select {|post| post.user==current_user}.each do |post| %> 
    <%= post.content %><br/> 
  <% end %> 
<% end %>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X