如果当前用户在rails中喜欢帖子,如何包含?

时间:2017-05-11 00:03:30

标签: sql ruby-on-rails activerecord

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

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个查询,每个帖子一个查看是否有人喜欢。最好的方法是什么?

由于

3 个答案:

答案 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