2010-08-23 6 views
1

J'utilise actuellement:Ruby on de find "Rails question

@user = User.find(params[:id]) 
@posts = Post.find(:all, :conditions => ["user_id = ?", @user.id]) 
@comments = Comment.find(:all, :conditions => ["user_id = ?", @user.id]) 

qui identifie l'utilisateur et répertorie tous leurs commentaires qu'ils ont fait. Toutefois, je veux définir une variable locale à utiliser dans le modèle _comment.html.erb. Je veux que la variable lise le nom du poste situé dans la colonne 'nom' de la table des postes.

J'ai essayé de faire:

@post_id = @comments.post_id 
@post_name = @post_id.name 

Mais il a montré une erreur de tableau (car @comments répertorie l'ensemble des commentaires des utilisateurs). Je dois trouver un moyen de trouver le post_id pour CHAQUE commentaire. Pourtant quand j'essaye d'employer quelque chose comme

@post_id = @comments.each.post_id 

Il montre une erreur parce qu'il ne reconnaît pas «post_id» comme méthode. Je veux qu'il sorte tout ce qui est dans la colonne post_id pour CHAQUE commentaire.

Répondre

5

Vous allez tout faux. L'idée est d'utiliser des associations afin que les rails vous fournissent des accesseurs. Vous ne devez utiliser que find pour obtenir votre enregistrement le plus haut. Rails va peupler les associations pour vous.

def User 
    has_many :posts 
    has_many :comments 
end 

def Post 
    belongs_to :user 
end 

Votre code devient alors:

@user = User.find(params[:id]) 

# you can omit these and just use @user.posts and @user.comments in your view 
@posts = @user.posts 
@comments = @user.comments 

Si vous voulez quelque chose de sortie pour chaque commentaire, utilisez une boucle dans votre vue

<div class="comments"> 
    <% @user.posts.each do |p| %> 
    <div class="post"> 
     <%= p.body %> 
    </div> 
    <% end %> 
</div> 
+0

Et pour répondre à la question elle-même, vous pouvez faire « commentaire .post.name "dans votre modèle. –

+0

Vous ne pouvez faire comment.post.name que si vous avez configuré les associations belongs_to et has_many. Sans cela, même si les tables ont des colonnes post_id et user_id, elles ne sauront toujours pas à qui ou à quoi elles appartiennent à moins qu'elles ne le soient. – AboutRuby

+0

Je peux extraire des données de la colonne 'user_id' dans le tableau Post, mais je n'arrive pas à comprendre comment utiliser ces données 'user_id' pour trouver les données de la colonne 'name' dans la table User. La table User a une colonne 'id' et une colonne 'name'; la colonne 'id' serait exactement la même que la colonne 'user_id' dans la table Post. – hohner

1

Ne délivrez-vous des requêtes lorsque vous pouvez mieux exploiter les associations.

Si un utilisateur has_many postes, et un post has_many commentaires, vous pouvez simplement faire.

user.posts 

et

post.comments 

En outre, il ressemble à un utilisateur has_many commentaires, vous pouvez directement faire

user.comments 

Pour obtenir l'ID du message d'un commentaire, faire un commentaire belongs_to un poste, alors vous pouvez faire:

comment.post.id # or comment.post.name directly 
0

Post a beaucoup de commentaires

et le commentaire appartient à la publication. le devrait créer la clé étrangère ou la colle entre la poste et le commentaire. N'oubliez pas que @user a tout le message avec le commentaire joint.

Donc, pour se rendre à l'id commentaires, allez de @ user.each.post ({| post |

post.comment}

1
class User 
has_many :posts 
end 

class Post 
belonds_to :user 
has_many :comments 
end 

class Comment 
belongs_to :post 
end 



<h1>users contriller</h1> 
@user = User.includes(:posts).where(:id => params[:id]).first 
<h1>in posts view</h1> 
<div class="comments"> 
<% @user.posts.each do |p| %> 
<div class="post"> 
<%= p.name %> 
</div> 
<% end %> 
</div> 
<h1>in comment view</h1> 
<div class="comments"> 
<% @user.posts.each do |p| %> 
    <div class="post"> 
<%= p.comments.body %> 
</div> 
<% end %> 
</div>