所以我有一个查询,获取所有最近的帖子
posts = Post.where(public: true).limit(25).order(created_at: :desc)
返回我需要的帖子。 现在我想返回帖子,但我也想包括拨打电话的用户是否喜欢该帖子。
我有一个类似的桌子,只有post_id,user_id。
现在我拥有它的方式是
render :json => posts.as_json(:include => [:likes])
它返回所有喜欢该帖子的人,这不是我想要的:
{
"id": 43,
"title": "asdfasdfs",
"story": "adfaf sdf sd asdf sdf asdf saf adf",
"created_at": "2017-05-10T22:40:54.587Z",
"updated_at": "2017-05-10T23:18:47.653Z",
"user_id": 8,
"likes": [
{
"id": 1,
"user_id": 4,
"post_id": 43
},
{
"id": 2,
"user_id": 6,
"post_id": 43
}
]
}
我要么只想包含用户喜欢的东西(以某种方式有一个包含来限制它(
或者以某种方式使其成为 JSON 中名为 liked_by_me 设置为 true 或 false 的变量。我试图避免不得不手动制作地图并再做 25 次查询,每个帖子一个查询以查看是否有人喜欢它。最好的方法是什么?
谢谢
您应该使用当前用户的 ID 和帖子 ID 查询多对多表,如果该记录存在,则表示用户喜欢该帖子。 存储类似内容类似于存储帖子的方式,但为用户 ID 和帖子 ID 添加 where 子句。如果该行存在,则返回该行,如果不存在,它将返回 nil。
我有类似的"问题"(而不是帖子,我有文章,但没关系(。我选择的处理方式如下:
用户模型如下所示:
class User < ActiveRecord::Base
has_many :articles ,dependent: :destroy
has_secure_password
has_many :likes
end
文章型号:
class Article < ActiveRecord::Base
belongs_to :user
has_many :likes
end
和喜欢的模型:
class Like < ActiveRecord::Base
belongs_to :article
belongs_to :user
end
喜欢控制器应如下所示:
def create
@like=Like.new(article_id:params[:article_id],user_id:params[:user_id])
if !(Like.find_by(user_id: params[:user_id], article_id: params[:article_id]))
if current_user!=Article.find(params[:article_id]).user
if @like.save
flash[:success]='Thanks for your like'
redirect_to article_path(params[:article_id])
else
render 'new'
end
else
flash[:warning]="You can't like your article"
redirect_to article_path(params[:article_id])
end
else
flash[:danger]='You liked this article once'
redirect_to article_path(params[:article_id])
end
end
current_user代码 :
def current_user
@current_user ||=User.find(session[:user_id]) if session[:user_id]
end
在文章中显示模板,我已经渲染了名为"_likes"的部分模板
<%= render 'likes' %>
我认为您所问的内容显示在部分模板"_likes"的这些行中
<% if !Like.find_by(user_id: current_user, article_id:@article.id) %>
<img src="/assets/no_like.png">
<% else %>
<img src="/assets/like.png">
<% end %>
如果您已登录并且尚未喜欢某篇文章,则显示模板将如下所示:没有来自登录用户喜欢的文章
另一种情况:如果您已登录并且喜欢该文章,则显示模板将如下所示:文章与你的喜欢
我希望这对你有帮助。
class User < ActiveRecord::Base
has_many :articles ,dependent: :destroy
has_secure_password
has_many :likes
end
class Article < ActiveRecord::Base
belongs_to :user
has_many :likes
def liked?(user)
!!self.likes.find{|like| like.user_id==user.id}
end
end
class Like < ActiveRecord::Base
validates :user_id, uniqueness: { scope: [:article_id]}
belongs_to :article
belongs_to :user
end
然后你检查:
if @article.liked?(@current_user)
参考:https://medium.com/swlh/how-to-add-a-simple-like-button-to-your-rails-6-application-c1040999dc2