我的数据库中有 2 个表。users
和trackers
。
正如您所期望的,每个Tracker
都有一个user_id
与表格相关的内容。users
这个应用程序的上下文是它是基于团队的时间跟踪解决方案的一部分。作为其中的一部分,我需要按用户迄今为止跟踪的总时间对用户进行排序,并在屏幕上显示该总时间。
所以我认为,每当Tracker
保存 a 时,我都会触发一个before_save
回调,该回调从对象中获取start_time
和值,并简单地以秒为单位获取跟踪器的时间。结果保存到. 这部分有效,我可以在数据库中看到计算值。end_time
Tracker
(end_time - start_time).to_i
Tracker.tracked_time
我现在需要保存每个用户的所有Tracker
实例tracked_time
值的总结果,然后我想将此值存储到那里users
的列中的表中,tracked_time
以便我可以将其从数据库中拉出以对结果进行排序(想想:大多数活跃用户、最不活跃用户、前 10 名)。
但是,当我尝试调用它时,before_save :calculate_tracked_time, if: :finished?, unless: :admin?
我只会得到一个ActiveRecord::RecordNotSaved
错误。
似乎我无法User
在模块内保存模型的值Tracker
......但我不知道为什么或如何做我需要的事情。
任何关于如何使这项工作(或更好地工作)的想法将不胜感激。
哦,模型:tracked_time
上User
的 列在 中,attr_accessible
因此可以写入。
下面是模型,如果需要Tracker
我也可以发布模型。User
class Tracker < ActiveRecord::Base
attr_accessible :running, :start_time, :end_time, :tracked_time, :intention, :achievement
belongs_to :user
before_save :calculate_tracked_time, if: :finished?, unless: :admin?
validates :user_id, presence: true
validates :intention, presence: true,
length: { minimum: 5 }
default_scope order: 'trackers.created_at DESC'
private
def finished?
# Only save the total amount of time elapsed if we have
# a start_time AND end_time for this object.
!self.end_time.nil?
end
def admin?
# Don't calculate totals for the admin user.
User.find_by_id( self.user_id ).admin?
end
def calculate_tracked_time
# write the tracker's tracked time value in seconds
self.tracked_time = ( self.end_time - self.start_time ).to_i
# update the user's tracked time total
user = User.find_by_id( self.user_id )
# calculate time from all trackers this user has
total_time = 0
user.trackers.each { |t| total_time += t.tracked_time }
# this log correctly prints the correct figures.
p "Total Time for user (#{self.user_id}): #{total_time}"
# store it to the user's :tracked_time db column
user.tracked_time = total_time
# save !!! Errors out.
user.save
end
end
谢谢阅读。