我有三个模型:user
,post
和comment
。
每个user
可以将一个comment
发布到一个post
。
每个post
都有许多comment
s。
我的问题是:
如何获取comment
的帖子current_user
的价值?
# model/user.rb
has_many :comments
has_many :posts through :comments
# model/post.rb
has_many :comments
# model/comment.rb
belongs_to :user
belongs_to :post
我知道我可以用:
# in the controller
@comments = current_user.comments
@user_post_comment = @comments.where(:post_id => post_id).first
首先,我认为必须采取更好的方式。
其次,因为在一个页面中可能有一些帖子,所以我必须做一些像@posts.each do |post|
这样的事情来显示视图中的帖子。
更新
然后像
current_user.post.comment
一样。我想知道该怎么做。
任何帮助都会很棒,谢谢大家!
更新2
我希望下面的代码可以帮助您理解我想要做的事情。
<%= @posts.each do |post| %>
<%= post.name %>
<%= how to show current_user comment of the post %>
<% end %>
解决方案
现在我有这样的解决方案:
# controller:
@comments_by_curr_user = Comment.
where(post_id: @post.ids). # if paginate
where(user_id: current_user.id).
group_by(&:post_id)
# view:
<%= @posts.each do |post| %>
<%= post.name %>
<% @comments_by_curr_user[post.id].each do |comment| %>
... .............
<% end %>
<% end %>
谢谢大家的帮助。
答案 0 :(得分:1)
如果您有post_id
,那么
current_user.comments.find_by(post_id: post_id)
返回current_user
对该帖子发表的一条评论。
关于你的第二次更新,你可以在post模型中创建一个看起来像这样的辅助方法
# app/models/post.rb
def find_comment_for_user(user)
user.comments.find_by(post_id: self.id)
end
现在只需在您的视图中使用此方法
<%= @posts.each do |post| %>
<%= post.name %>
<%= post.find_comment_for_user(current_user) %>
<% end %>
答案 1 :(得分:0)
尝试
<script>
$(document).ready(function() {
$(".nav a").on("click", function(){
$(".nav").find(".active").removeClass("active");
$(this).parent().addClass("active");
});
});
</script>
我认为你的模特关系应该是
@comments = current_user.posts.where(id: post_id).first.comments