我正在使用PaperTrail审核User模型的州列。我需要在历史记录的特定时间搜索状态为“活动”的所有条目。像这样:
User.where('version_at(time).state = ?', "active)
PaperTrail有那个version_at(date)方法,但它是一个实例方法,我找不到一个类。
目前我正在做以下事情,但是非常不优雅,并且它会进行数千次查询以获得我需要的内容:
assigning_users_ids = []
User.each do |user|
if user.version_at(@date).state == "active"
assigning_users_ids << { user_id: user.id, profile_id: user.profile_id}
end
end
现在我在数组中包含了所有用户ID和配置文件,我需要通过配置文件将它们分开:
@assignable_starter_ids = []
@assignable_general_ids = []
@assignable_pro_ids = []
@assignable_reduce_ids = []
assigning_users_ids.each do |a|
case a[:profile_id]
when Profile.starter.id
@assignable_starter_ids << a[:user_id]
when Profile.general.id
@assignable_general_ids << a[:user_id]
when Profile.pro.id
@assignable_pro_ids << a[:user_id]
when Profile.reduce.id
@assignable_reduce_ids << a[:user_id]
end
end
@assignable_starter = User.where(id: @assignable_starter_ids)
...
Edit1:这是.user.version_at(@date)
的结果示例查询PaperTrail::Version Load (0.5ms) SELECT `versions`.* FROM `versions` WHERE `versions`.`item_id` = 1 AND `versions`.`item_type` = 'User' AND (`versions`.`created_at` > '2016-01-01') ORDER BY `versions`.`created_at` ASC, `versions`.`id` ASC LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 [["id", 1]]
Edit2:这是PaperTrail文件中的version_at方法:
def version_at(timestamp, reify_options={})
# Because a version stores how its object looked *before* the change,
# we need to look for the first version created *after* the timestamp.
v = send(self.class.versions_association_name).subsequent(timestamp, true).first
return v.reify(reify_options) if v
self unless self.destroyed?
end
PaperTrail存储在审计更改之前的方式和对象。因此,它会查找在给定时间之后保存的第一个版本。它有一个版本,它创建对象(不保存它),因为它在那个文件。如果没有新版本,则按原样返回当前对象。我降低了我的期望......
此外,PaperTrail将所有对象属性保存在一个字符串中......
答案 0 :(得分:1)
我需要搜索状态为&#34;活动&#34;的所有条目。但是在历史的特定时间。
您可以从找到给定时间范围内的版本记录开始。
start_time = Time.utc(2016, 2, 1, 0, 0, 0)
end_time = Time.utc(2016, 2, 2, 0, 0, 0)
versions = ::User.
versions.
where_object(state: "active").
between(start_time, end_time)
然后你可以&#34; reify&#34;这些版本记录可以获取User
个对象。
versions.first.reify # => a User object
这不完全是你想要的,但应该让你开始。