从' has_many到'获取属性值关联

时间:2017-03-25 12:49:34

标签: ruby-on-rails activerecord

我有三个模型:userpostcomment

每个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 %>

谢谢大家的帮助。

2 个答案:

答案 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