Ruby on rails 3 如果用户拥有10个以上的项目,Rails 3将销毁数据库中最旧的项目
我在rails 3中使用STI设计了一个活动流 我想做一个检查,看看一个用户在创建时是否有超过10个活动项。当用户在数据库中创建第11个活动时,我希望它销毁最旧的记录*基本上是用户创建的第一个记录,依此类推。*这样,我就可以保持数据库中数千条旧的无用记录的干净 我假设我将从模型级别开始,但是因为我不想在模型中定义“当前用户”,它应该在控制器中Ruby on rails 3 如果用户拥有10个以上的项目,Rails 3将销毁数据库中最旧的项目,ruby-on-rails-3,android-activity,model,sti,Ruby On Rails 3,Android Activity,Model,Sti,我在rails 3中使用STI设计了一个活动流 我想做一个检查,看看一个用户在创建时是否有超过10个活动项。当用户在数据库中创建第11个活动时,我希望它销毁最旧的记录*基本上是用户创建的第一个记录,依此类推。*这样,我就可以保持数据库中数千条旧的无用记录的干净 我假设我将从模型级别开始,但是因为我不想在模型中定义“当前用户”,它应该在控制器中 如果您能帮我完成这项任务,我将不胜感激。我对rails中的这类更高级的任务相当陌生。您可以在AR回调中连接这一逻辑。假设在建模类时保持rails约定,并且
如果您能帮我完成这项任务,我将不胜感激。我对rails中的这类更高级的任务相当陌生。您可以在AR回调中连接这一逻辑。假设在建模类时保持rails约定,并且每个活动都属于一个用户,那么您可以在
活动
模型中轻松执行以下操作:
after_save do |record|
if Activity.where(:user => record.user).count >= 11
Activity.where(:user => record.user).order('created_at asc').first.destroy
end
end
我猜这将为数据库创建三个事务(一个用于计数,另一个用于查找第一条记录,另一个用于删除它)。我想知道是否有更有效的方法来实现这一点,因为它将在每个
活动#save
…中调用。您可以在AR回调中连接此逻辑。假设在建模类时保持rails约定,并且每个活动都属于一个用户,那么您可以在活动
模型中轻松执行以下操作:
after_save do |record|
if Activity.where(:user => record.user).count >= 11
Activity.where(:user => record.user).order('created_at asc').first.destroy
end
end
我猜这将为数据库创建三个事务(一个用于计数,另一个用于查找第一条记录,另一个用于删除它)。我想知道是否有更有效的方法来做到这一点,因为它将在每个
活动#save
…中调用。哦,你是一个救生员!既然你在质疑它的效率,我现在还不会勾选它,但是如果今天没有人回应,我会勾选它,太棒了!!很乐意帮忙。但老实说,在现实世界中我不会这么做。相反,您可以始终为活动模型提供一个类方法或范围,以获取给定用户的最新10个活动。这样,您就可以保留所有用户活动的历史记录,并且不会浪费资源在每次活动#save
呼叫时额外查询数据库。哦,您是一个救生员!既然你在质疑它的效率,我现在还不会勾选它,但是如果今天没有人回应,我会勾选它,太棒了!!很乐意帮忙。但老实说,在现实世界中我不会这么做。相反,您可以始终为活动模型提供一个类方法或范围,以获取给定用户的最新10个活动。这样,您就可以保留所有用户活动的历史记录,并且不会浪费资源在每次活动#save
调用时额外查询数据库。