Rails SQL 的问题,活动的列表里面需要获取当前用户的是否喜欢了某一条活动

zhzenghui · 2015年08月19日 · 最后由 zhzenghui 回复于 2015年08月20日 · 1908 次阅读

活动的列表里面需要获取当前用户的是否喜欢了某一条活动,我不知道 rails 该怎么写这个 sql,有没有大神给个思路,或者给个链接什么。rails 新手求帮助

是要先执行 分页活动列表搜索,然后再进行当前用户喜欢的判断吗?

现在有两个想法 想法一:搜索活动列表,然后使用活动 ids 和 user_id 搜索出当前用户的喜欢的 活动 id,然后组合数据。搜索我还会点,组合完全没有头绪啊。 想法二:搜索活动列表,然后在 model 层建立一个喜欢的字段 在 get 方法里面来做搜索,这个我觉得是比较简洁的,但是不知道这样好不好。也不太知道 怎么写。

我试了下想法二 添加 attr_accessor,rails c 输出正常,但是 json 化的数据是没有该字段的。不知道为什么

attr_accessor :current_user_like_state

 def current_user_like_state
   这里来做sql  喜欢的判断
 end

 def current_user_like_state=(like_state)
   self.current_user_like_state = 1
 end


我觉得第一个思路需要组合数据,有点麻烦,所以我实现了第二个想法。

class Online < ActiveRecord::Base

  attr_accessor :is_like




  def is_like

    sql = "type = 1 AND state  = 1  AND object_id  =  #{self.id}  AND user_id  =  #{self.user_id}"
    like =  Like.where( sql )
    if like.count == 0
        self.is_like =  0
    else
        self.is_like =  1
    end
  end


  def as_json(options)
    super(:only => [:id, :user_id, :title, :description, :cover_url, :user, :current_user_like_state, :relation_url], :methods => :is_like )
  end

model 添加了两个方法 实现了该功能。做的不好,欢迎各位提供的新思路。感谢楼下各位的回答。谢谢你们。

建议搞一张中间表叫 likes, 连接 user 和 likeable,活动可以是 likeable,其他的东西也可以是 likeable,用户喜欢一个活动,就往 likes 表里插入一条新纪录,用户 unlike 一个活动,就从 likes 表里删除这条记录

先设计好表结构,再考虑代码。

Mark 一下!

#1 楼 @leomayleomay 恩,我知道是需要一张 like 表,现在不太知道,活动列表包含当前用户喜欢状态怎么在 sql 中(或者 ar)中怎么写。

#5 楼 @zhzenghui 这种应该分离出来。

  1. 取出活动列表数据
  2. 取到用户喜欢的所有活动 ID(一般都不太可能非常大)
  3. 在页面写上逻辑:<%= @user_like_ids.include? 活动.id %>

或者每一条单独去查一下

user.likes.exists? event_id: 活动.id

将活动数据以及用户行为数据分离出来,还比较好做缓存

更灵活的设计 acts-as-markable 有弊有利,自行抉择。

@zhzenghui 贴一下你的 schema

#6 楼 @hz_qiuyuanxin 恩,今天我也问了个人,他和你说的基本一样,不过他是用 in 来搜索,做两次搜索然后 数据组合。 第二点 获取所有喜欢的活动对我这种点赞狂魔不太适合(800 个喜欢)。 关于缓存他也说 这样逻辑分离之后会好处理些。 现在就是

于我这个新手来说。在活动表 里面怎么加这个喜欢字段实现起来该怎么实现。
是在这里来 组合数据呢,还是放到 model 层去处理。

@onlines = Online.where( "order_num >= 10000 AND state  = 1"  ).paginate(:page => params[:page])
render :status => 200,
                :json => { :status => 1,
                                 :info => "",
                                 :data => @onlines
                                }

新手,如果可以贴些代码 感激不尽

#7 楼 @flowerwrong 我的我仔细去看看。

#8 楼 @leomayleomay 现在的思路我想(#7 可以看下 7 楼)7 楼这样实现 想法一:搜索活动列表,然后使用活动 ids 和 user_id 搜索出当前用户的喜欢的 活动 id,然后组合数据。搜索我还会点,组合完全没有头绪啊。 想法二:搜索活动列表,然后在 model 层建立一个喜欢的字段 在 get 方法里面来做搜索,这个我觉得是比较简洁的,但是不知道这样好不好。也不太知道 怎么写。

这种需求正是 redis 的应用场景

#12 楼 @alucardpj 我搜索了下 redis 的提供了交集、并集、差集的搜索功能,但是还是不太明白。该怎么做。可以详细点说吗。

#14 楼 @alucardpj 谢谢。这就去看看。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号