Rails活动来自多态跟随

时间:2014-03-07 20:48:45

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4

我正在跟踪以下表格:

Story (id, user_id, content)
Vote  (id, user_id, story_id)
Flag  (id, user_id, story_id)
etc..

带有活动表:

Activity (id, user_id,action, trackable_id, trackable_type)

关系表:

Relationship (id, follower_id, followed_id)

我目前正在接收用户正在关注的用户的活动:

def get_activity_from_followers(current_user)
     followed_user_ids = "SELECT followed_id FROM relationships
                         WHERE follower_id = :user_id"
    where("user_id IN (#{followed_user_ids})",
          user_id: user.id)
end

我的问题是,我如何获得可跟踪表(例如,故事,投票,旗帜)所属的活动。
所以现在我得到的东西是:

  1. “你关注的人”发布了一个故事
  2. “你跟随的人”投了一个故事

  3. 我也希望得到类似的东西:

    1. “你不跟随的人”投了你的故事
    2. “你不跟随的人”标记了你的故事
    3. 我该如何解决这个问题?感谢。

3 个答案:

答案 0 :(得分:1)

我建议您使用以下类定义和关联:

# User 
class User  :trackable
end

# Flag  (id, user_id, story_id)
class Flag  :trackable
end

# with an activity table:
# Activity (id, user_id,action, trackable_id, trackable_type)
class Activity  true
end

# The relationship table:
# Relationship (id, follower_id, following_id)
class Relationship  "User"
  belongs_to :following, :class_name => "User"
end

现在,让我们找到您关注的用户的活动:


# List activities of my followings
Activity.where(:user_id => current_user.followings)

列出我的活动

current_user.activities

答案 1 :(得分:0)

为了解决这个问题,我使用投票和标记ID来搜索活动,而不是用户ID#s。像这样:

def get_votes(current_user)
 stories = current_user.stories
 votes = Votes.where(story_id: stories.map {|s| s.id})
 activity = Activity.where(action: 'vote', trackable_id: votes.map{|v| v.id})
end
我发布了一些假设。首先,您可以调用user.stories,然后调用活动模型'操作'可以是投票或标志,trackable_id与投票和标志ID相关。如果这不正确,无论如何你都可以得到一般的想法。

希望有所帮助

答案 2 :(得分:0)

如何制作活动STI课程?

class Story < ActiveRecord::Base
  belongs_to :user
end

class Activity < ActiveRecord::Base
  belongs_to :story
  belongs_to :user
end

class Vote < Activity
  def to_partial_path
    'users/vote'
  end
end

class Flag < Activity
  def to_partial_path
    'users/flag'
  end
end

您可以将所有用户操作存储在同一个表中,并通过以下方式从中获取:

Activity.where(user_id: uid).all 

并且您获得所有用户操作的返回数组,并且每个操作都有正确的输入,这允许您为不同类型的操作实现多态逻辑(对于我的示例中的部分路径,它允许您编写类似于: / p>

render Activity.where(user_id: uid).all