gpt4 book ai didi

ruby-on-rails - 在带有 Paper_trail 的类上使用具有特定时间版本的 where 方法

转载 作者:行者123 更新时间:2023-12-04 12:47:40 28 4
gpt4 key购买 nike

我正在使用 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 将所有对象属性保存在一个字符串中...

最佳答案

I need to search all entries with the state "active" BUT at a specific time in history.



您可以从查找给定时间范围内的版本记录开始。
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)

然后,您可以“具体化”这些版本记录以获取 User对象。
versions.first.reify # => a User object

这不完全是你想要的,但应该让你开始。

关于ruby-on-rails - 在带有 Paper_trail 的类上使用具有特定时间版本的 where 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34876433/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com