如何计算用户在rails中的页面浏览量?

时间:2017-05-26 12:46:15

标签: ruby-on-rails ruby

我有一个简单的rails应用程序,用户可以登录和发布更新我想要做的是在每个帖子中添加一个计数,所以如果有人访问帖子它将得到更新假设如果100个用户访问了特定帖子它应该显示数到百。

我曾见过印象派,但我想在不使用宝石的情况下这样做。

我想创建另一个模态 @Injectable() export class WebSocketService{ public createWebsocket(url: string): Subject<MessageEvent> { let socket = new WebSocket(url); let observable = Observable.create( (observer: Observer<MessageEvent>) => { socket.onmessage = observer.next.bind(observer); socket.onerror = observer.error.bind(observer); socket.onclose = observer.complete.bind(observer); return socket.close.bind(socket); }); let observer = { next: (data: Object) => { if (socket.readyState === WebSocket.OPEN) { socket.send(JSON.stringify(data)); } } }; return Subject.create(observer, observable); } }

PostView

6 个答案:

答案 0 :(得分:2)

大型项目(成千上万的用户)的最佳解决方案是 出气筒的宝石,请查阅文档进行整合:punching_bag

当每个请求都创建一个新记录,这给数据库带来了巨大的负担时,就会出现主要问题。宝石印象主义者在这里失败。出气筒也可以创建记录,但是它有一个可以解救的耙任务:

计划每月一次或每周一次的计划任务,以减少(对记录进行分组)记录的数量,而不会影响通过-@post.hits可以找到的页面浏览量。 这是瑞克任务: rakepuning_bag:combine [by_hour_after,by_day_after,by_month_after,by_year_after]

答案 1 :(得分:1)

您可以在模型中添加视图字段,并在每个页面视图上递增它

def change
  add_column :page_views, :count, :integer, default: 0
end

# app/controllers/pages_controller.rb
def increment
  @pageview = PageView.where(user_id: current_user, page_id: params[:id]).first_or_create
  @pageview.increment!(:count)
end

只需在页面控制器中添加一个路径

# routes.rb
resources :pages do 
  post :increment 
end

答案 2 :(得分:1)

由于尚未提及,您还应该结帐https://github.com/charlotte-ruby/impressionist,这样可以非常轻松灵活地查看视图。

这是随每个视图保存的数据,可以在以后方便使用:

t.string   "impressionable_type"  # model type: Widget
t.integer  "impressionable_id"    # model instance ID: @widget.id
t.integer  "user_id"              # automatically logs @current_user.id
t.string   "controller_name"      # logs the controller name
t.string   "action_name"          # logs the action_name
t.string   "view_name"            # TODO: log individual views (as well as partials and nested partials)
t.string   "request_hash"         # unique ID per request, in case you want to log multiple impressions and group them
t.string   "session_hash"         # logs the rails session
t.string   "ip_address"           # request.remote_ip
t.text     "params"               # request.params, except action name, controller name and resource id
t.string   "referrer"             # request.referer
t.string   "message"              # custom message you can add

因此,举例来说,您可以查询类似于“给我按照模型和会话分组的特定用户的所有视图”。和这样的东西。

答案 3 :(得分:0)

基本上您可以添加其他字段以发布,例如visit_counter

class Post
  def increase_visit
    visit_counter+=1
    save!
  end
end

然后在posts_controller#show中,你可以做一些增量:

class PostsController
  def show
  ............
  @post.increase_visit
  end
end

这意味着,每次呈现posts#show时,某人实际访问了特定帖子,因此您应该增加访问次数。

如果您需要更灵活和更先进的方法(计算每个用户或每天的访问次数等),您可以定义与您的VisitCounter模型相关联的单独模型Post

此致

答案 4 :(得分:0)

根据@Deepak的建议,您可以在模型中添加视图字段

def change
  add_column :page_views, :count, :integer, default: 0
end

然后,在controller show行动中

def show
  #your show logic
  if (user = current_user).present?
    current_user.page_views.where(page_id: @page.id).first_or_initialize.increment!(:count)
  end
end

这是有道理的,因为无论何时访问该页面,计数器都应增加1 ..并保存您的发布请求..

答案 5 :(得分:0)

我们认为我们的博客上有文章。在索引页面文章名称中,将打印文章的文本和主题。因此,我们必须在没有每篇文章的视图的索引页面中引入新列。

进行以下更改。

应用/视图/物品/ index.html.erb

  1. 添加到表格中。

    <th>view</th>
    
  2. 开头添加到数据摘要部分
    <%@articles.each_with_index do |article, index| %>  .
    
    <td><%= article.view %></td>
    
  3. 将新列添加到文章数据库中作为视图

    1. 如果您使用的是mysql,您可以手动将列添加为视图,默认值为0。
    2. 或运行代码

      rails generate migration add_view_to_article view:int
      
    3. 应用/控制器/ articles.controller.rb

      def show
      @article = Article.find(params[:id])
      abc = @article.view += 1
      @article.update_attribute "view", abc
      end