我正在寻找能够解决以下问题的解决方案:
我们为多个应用程序(所有命中同一个数据库)设置了共享模型,因此我们能够记录数据来自哪个应用程序。这就是我们想要在我们的应用程序通用的中心位置实现这样的东西。
这样做的原因是因为我们在事后做了很多取证 - 我们被要求检查谁将某些内容更改为记录,因此我们经常需要转到生产日志并在那里搜索该信息。如果可能的话,我们希望能够使用标准SQL来查询它。
这样做的另一个原因是因为不同的开发人员拥有不同的应用程序,有时某些应用程序的行为不应该如此。如果我能够查找哪个应用程序将特定值保存到模型对象中,那会有所帮助。
关于我们将要查看的控制器名称/操作没有任何模式 - 我们在某些模型上添加了审核逻辑,但随后我们会被要求检查一些我们没有的模型设立审计。
如果有意义,我们愿意为此目的使用像Redis这样的东西。我在使用Redis方面经验很少,并且不确定Redis是否能够处理这样的事情。
这是一个现实的期望 - 能够记录每个用户操作吗?我估计,从各种应用程序中,我们每小时可能总共有300到500个用户操作。或者我是否应该停止探索这种可能性,并在框外思考,而不是如何跟踪用户的行为?
答案 0 :(得分:0)
它的现实。人们使用Redis进行一般缓存,因此只是跟踪用户使用情况应该不是问题。
使用redis对象gem https://github.com/nateware/redis-objects
对于每个操作,创建一个redis哈希。
每个哈希都包含每个用户的密钥(他们的ID可以使用)。每个密钥都会导致该用户执行操作的次数。
在进行计数时,你甚至可以使用incr方法获得额外的速度。
此外,如果您需要格外小心,可以将其设置为在X增量后,您可以将信息保存回用户行的数据库中。这当然会耗尽一些资源,但如果它值得你,那值得你。
编辑: 我想我应该提供一个示例控制器
class BlogController < OneForMyBabyController
def show
#Your Code Here
#---------------
if logged_in
#When you create a new Redis::HashKey its first look to redis
#if the object already exists it just gets it, other wise it
#'creates it'*.
blog_show_user_tracking = Redis::HashKey.new("BlogShowUserTracking")
blog_show_user_tracking.incr(@user.id)
#This is about how would deal with updating after a number of incr
#This would require a separate look up from the incr above.
#x here is the number of incr before you update the SQL DB
if blog_show_user_tracking[@user.id] % x == 0
#Update User To Reflect New Tracking
end
end
end
end
编辑:显示仅在用户登录时如何使用它。