所以我有一个查询获取所有最近的帖子
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中的变量,名为likes_by_me,设置为true或false。我试图避免虽然必须手工制作地图并再做25个查询,每个帖子一个查看是否有人喜欢。最好的方法是什么?
由于
答案 0 :(得分:0)
您应该使用当前用户的ID和帖子ID查询多对多表,如果该记录存在,则表示用户喜欢该帖子。存储类似于您存储帖子的方式,但添加用户ID和帖子ID的where子句。如果该行存在,则返回该行,否则返回nil。
答案 1 :(得分:0)
我有类似的问题' (而不是我有文章的帖子,但它并不重要)。我选择处理这个的方式如下:
用户模型如下所示:
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
和Like模型:
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
在文章展示模板中,我已经呈现了名为&#39; _likes&#39;
的部分模板<%= render 'likes' %>
我认为你所询问的内容会从部分模板中显示出来&#39; _likes&#39;
<% 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 %>
如果您已登录且尚未喜欢文章,那么展示模板将如下所示: Article with no like from the user logged in
另一个案例: 如果您已登录并且您已经喜欢该文章,那么展示模板就会像: Article with like from you
我希望这会对你有所帮助。
答案 2 :(得分:0)
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