用户的显示名称,所有喜欢特定帖子的用户

时间:2019-12-07 16:53:13

标签: ruby-on-rails

我想命名所有喜欢该帖子的用户。

我有4种模型:用户,帖子,喜欢和评论。

一个用户可以有很多帖子。 帖子可以评论,并且帖子可以有很多赞。

我可以计算喜欢帖子的人数,但不能显示喜欢帖子的用户的姓名。

类似模型:

class Like < ApplicationRecord
  belongs_to :post
  belongs_to :user
end

发布模型

class Post < ApplicationRecord
  belongs_to :user
  has_many :reviews, dependent: :destroy
  has_many :likes, dependent: :destroy
  validates :title, presence: true
  validates :body, presence: true
end

查看模型:

class Review < ApplicationRecord
    belongs_to :user
    belongs_to :post
end

用户模型:

class User < ApplicationRecord

  before_create { generate_token(:auth_token) }

  before_save { self.email = email.downcase }

  has_secure_password

  has_many :posts
  has_many :reviews
  has_many :likes

  validates :name, presence: true
  validates :email, presence: true, uniqueness: true
  validates :password, confirmation: true
  validates :password_confirmation, presence: true, unless: Proc.new { |a| !a.new_record? && a.password.blank? }

  def send_password_reset
    generate_token(:reset_password_token)
    self.reset_password_sent_at = Time.zone.now
    save!
    UserMailer.password_reset(self).deliver
  end


  def generate_token(column)
    begin
      self[column] = SecureRandom.urlsafe_base64
    end while User.exists?(column => self[column])
  end

end[![enter image description here][1]][1]

_post.html.erb

<h1> Posts ( <%= @posts.count %> ) </h1>
<% @posts.each do |p| %>
    <div class="form-field">

        <h4>
            <b><%= p.title %></b>
            <%= link_to "Edit", edit_post_path(p.id), class: "btn btn-warning col-md-2-offset", style: "align-right" %> 
            <%= link_to "Delete", p, method: :delete, class: "btn btn-danger col-md-2-offset" ,data: { confirm: "You sure? "}, style: "align-right" %> 
            <% if p.reviews.count > 0 %>
                 <%= link_to "View Comments", review_path(p.id), class: "btn btn-primary" %>
            <% end %>
        </h4> 
        <%= p.body %>
        <br>
            <% if p.likes.count > 0 %>
               Likes: <%= p.likes.count %>
            <% end %>
        <br>
            <% if Like.find_by(user_id: current_user.id,post_id: p.id) %>
               <%= link_to " UnLike ", like_path(p.id), method: :delete,class: "btn btn- 
   primary fa fa-thumbs-down" %>
            <% else %>
               <%= link_to " Like ", post_likes_path(p.id), method: :post, class: "btn btn- 
    primary fa fa-thumbs-up" %>
            <% end %>
        <br> 
    </div>
<% end %>

我正在尝试这样的事情, enter image description here

我需要连接用户(如post table)和某个用户喜欢的post。 我不知何故需要合并两个查询。

3 个答案:

答案 0 :(得分:0)

@like是一个数组, 代替使用 @like = @ liked.where(post_id:7).first

然后尝试@ like.user

答案 1 :(得分:0)

  • 首先,我希望您在加载帖子的顶赞及其帖子 users

    时,能够使用预先加载功能来防止N+1 issue
  • 第二

    我建议改变这种代码的和平性

        <% if Like.find_by(user_id: current_user.id,post_id: p.id) %>
           <%= link_to " UnLike ", like_path(p.id), method: :delete,class: "btn btn-primary fa fa-thumbs-down" %>
        <% else %>
           <%= link_to " Like ", post_likes_path(p.id), method: :post, class: "btn btn-primary fa fa-thumbs-up" %>
        <% end %>
    

    使用

        <% if p.likes.find_by(user_id: current_user.id) %>
           <%= link_to " UnLike ", like_path(p.id), method: :delete, class: "btn btn-primary fa fa-thumbs-down" %>
        <% else %>
           <%= link_to " Like ", post_likes_path(p.id), method: :post, class: "btn btn-primary fa fa-thumbs-up" %>
        <% end %>
    

    这将不会执行其他 DB 请求

  • 最后显示如何显示喜欢该帖子的每个用户的用户名 我建议为此创建一个辅助方法,因为可能需要多个位置

    def liked_by_users(post)
       post.likes.map do |like|
          like.user.username
       end.join(', ')
    end
    

答案 2 :(得分:-1)

您是否只是想获取喜欢帖子的用户的姓名来显示他们?如果是这种情况,您可以在一个控制器中添加一个名为get_likes_for(post_id)之类的函数,该函数将返回一个喜欢帖子的所有用户的数组:

def get_likes_for(pid)
  users = []
  Like.where(post_id: pid).each do |l|
    users << User.find_by(id: l.user_id).name
  end
  users
end

然后您可以像这样在您的帖子控制器中列出它们:

<% if p.likes.count > 0 %>
    Likes: <%= p.likes.count %>
    Liked By: <%= get_likes_for(p.id).to_s %>
<% end %>

这不会像您的帖子的最后一部分所要求的那样完全连接这三个模型,但至少可以让您显示喜欢该帖子的用户。