Как создать простой поток активности? - PullRequest
4 голосов
/ 11 октября 2011

Я пытаюсь реализовать простой поток действий.

Given that User abc creates a post 123
And User xyz comments on 123.  
Then user abc's activity stream should look something like:
<ul>
  <li>User <a href="/users/abc">abc</a> created a post <a href="/users/abc/posts/123">123</a></li>
  <li>User <a href="/users/xyz">xyz</a> commented on post <a href="/users/abc/posts/123">123</a></li>
</ul>

Я предпочитаю заполнять модель деятельности (а не несколько запросов в контроллере). Я добавил хук after_create к моделям постов и комментариев, чтобы заполнить действие:

class Post < ActiveRecord
  after_create do
    ActivityCreate(:user_id => self.user_id, :description => "created a post")
  end
end

Я думал о хранении специальных полей, которые мне понадобятся для создания маршрутов и ссылок, таких как post_id и т. Д., Но у меня может быть больше действий, которые я хочу отслеживать позже, лайки, антипатии, избранное и т. Д., И я хочу гибкие способ создания описаний деятельности.

Итак, мой вопрос: как эффективнее поместить link_to в описание деятельности? Есть ли какой-нибудь способ печати printf в стиле c для последующего анализа?

вроде как:

description = ["Пользователь? Прокомментировал сообщение?", User_path (User.find (self.user_id)), post_path (Post.find (self.id))]]

А потом оцените это на стороне шаблона?

1 Ответ

2 голосов
/ 11 октября 2011

Это моя первая ассоциация по вашему делу. Возможно, это вас достаточно вдохновляет:)

class Activity < ActiveRecord::Base
  #this might be a comment or a post or something else
  belongs_to :changed_item, :polymorphic => true
  #who did it?
  belongs_to :user
  #what did he do?
  validates_presence_of :changes

  def msg
    #do fancy text generation
    if changes.new_record
      "#{user.name} created a #{changed_item.class}"
    else
      "#{user.name} changed #{changes.length} attributes of the #{changed_item.class} #{changed_item.title}"
    end
  end

  def initialize(model, user)
    #fetch changes and remember user and changed model
    self.changed_item = model
    self.user = user
    self.changes << model.changed_attributes.merge({:new_record => model.new_record?})
  end
end

class Post < ActiveRecord::Base
  after_save do
    #remember who to be blamed
    Activity.create(self, current_user)
  end
end

class User < ActiveRecord::Base
  #the users activities
  has_many :activities
end
...