我想命名所有喜欢该帖子的用户。
我有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 %>
我需要连接用户(如post table)和某个用户喜欢的post。 我不知何故需要合并两个查询。
答案 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 %>
这不会像您的帖子的最后一部分所要求的那样完全连接这三个模型,但至少可以让您显示喜欢该帖子的用户。