如何在 rails 中包含当前用户是否喜欢帖子



所以我有一个查询,获取所有最近的帖子

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

最新更新