我有一个简单的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
答案 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 强>
添加到表格中。
<th>view</th>
以
开头添加到数据摘要部分<%@articles.each_with_index do |article, index| %> .
<td><%= article.view %></td>
将新列添加到文章数据库中作为视图
或运行代码
rails generate migration add_view_to_article view:int
应用/控制器/ articles.controller.rb 强>
def show
@article = Article.find(params[:id])
abc = @article.view += 1
@article.update_attribute "view", abc
end