如何在 Ruby on Rails 中使用映射表跟踪模型历史记录?

2023-11-22

dream

我想记录用户何时更改地址。

这样,当下订单时,它将始终能够引用下订单时使用的用户地址。

可能的图式

users (
  id
  username
  email
  ...
)

user_addresses (
  id
  label
  line_1
  line_2
  city
  state
  zip
  ...
)

user_addresses_map (
  user_id
  user_address_id
  start_time
  end_time
)

orders (
  id
  user_id
  user_address_id
  order_status_id
  ...
  created_at
  updated_at
)

在 sql 中,这可能看起来像:[sql]

select ua.*

from  orders    o

join  users     u
  on  u.id = o.user_id
  
join  user_addressses_map   uam
  on  uam.user_id = u.id
  and uam.user_address_id = o.user_address_id
  
join  user_addresses        ua
  on  ua.id = uam.user_address_id
  and uam.start_time < o.created_at
  and (uam.end_time >= o.created_at or uam.end_time is null)
;

编辑:解决方案

@KandadaBoggu 发布了一个很好的解决方案。这Vestal 版本插件 is a 很好的解决方案.

下面的片段摘自http://github.com/laserlemon/vestal_versions

最后,DRY ActiveRecord 版本控制!

行为作为版本 by 技术知识这是一个很好的开始,但它未能跟上 ActiveRecord 在 2.1 版本中引入脏对象的步伐。此外,每个版本化模型都需要自己的版本表,该表复制原始表的大部分列。然后,版本表中会填充通常与原始记录的大部分属性重复的记录。总而言之,不是很干。

维斯塔版本仅需要一个版本表(与其父模型多态关联),并且无需对现有表进行任何更改。但它通过存储序列化的哈希值来实现更干燥的一步only模型的变化。想想现代版本控制系统。通过遍历更改记录,可以将模型恢复到任何时间点。

这正是 Vestal_versions 所做的。模型不仅可以恢复到以前的版本号,还可以恢复到日期或时间!


Use the Vestal 版本插件为了这:

参考this屏幕截图以了解更多详细信息。

class Address < ActiveRecord::Base
  belongs_to :user
  versioned
end


class Order < ActiveRecord::Base
   belongs_to :user

   def address
     @address ||= (user.address.revert_to(updated_at) and user.address)
   end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ruby on Rails 中使用映射表跟踪模型历史记录? 的相关文章

  • 将数据库表转换为 XML 模式文件

    我正在使用 SQL Server 2005 是否有任何命令或 GUI 工具 例如 SQL Server Management Studio 中的任何菜单 功能 可以将数据库表转换为 XML 架构文件 xsd 提前致谢 乔治 我找到了这个 试
  • Rails 中是否可以跨多个数据库进行内部联接?

    我很难使用has many through关联 其中一些表位于单独的数据库中 database one class Input lt ApplicationRecord belongs to user Works great end dat
  • 当你不继承Rails 4中的ApplicationController时,如何包含respond_to?

    我在 Rails 4 1 2 应用程序中有一个 API 控制器 它不继承自应用程序控制器 我试图包含 respond to 方法并得到一个方法未定义的错误 所以然后我需要在顶部的操作包 如下所示 require action pack cl
  • Ruby on Rails:如何设计 SaaS 基础设施?

    我正在构建一个 Rails 3 应用程序 计划将其作为基于订阅的 SaaS 软件即服务 产品提供 基本上 我希望用户能够点击我的 注册 页面 创建一个新帐户 并立即开始使用该软件 我想要实现的一个很好的例子是 http www gethar
  • Ruby on Rails 中的枚举

    我是一名 C 程序员 我正在研究 ruby on Rails 但我可能在心态或其他方面遇到了一些麻烦 我有一个投票对象 该对象可以是赞成 中立或反对 我通常会让投票对象有一个像这样的字段 private VoteEnum voteEnum
  • Rails 5.2 Active Storage 添加自定义属性

    我有一个带有附件的模型 class Project lt ApplicationRecord has many attached images end 当我附加并保存图像时 我还想保存一个附加的自定义属性 display order 整数
  • 按共同关联的数量排序 (Rails)

    背景 我有帖子和用户 并且都有很多社区 客观的 对于任何给定的用户 我想返回一个帖子集合 按该帖子与该用户有共同社区的数量排序 具有更多共同社区的帖子位于更高的位置 我当前的尝试 使用排序方法 有效 Post includes commun
  • 包括 collection_select 帮助程序的空白和默认值

    我希望在 Rails 应用程序的下拉列表中有一个 选择一个选项 选项 我正在使用collection select辅助标签 它看起来像这样 我希望下拉菜单的默认选项是 选择国家 地区 Use the include blank option
  • Rails 上的 SASS 无效 CSS 错误

    我正在尝试使用http startbootstrap com stylish portfolio http startbootstrap com stylish portfolio但是 在我的 Rails 应用程序中 我在 vintage
  • 初始化会破坏rails中的布局设置吗?

    在其中一个控制器中 我需要特定的布局 我添加了layout一开始 效果很好 但如果我添加一个initialize某些基于控制器的变量的函数 Rails 似乎只是忽略了layout命令 有人有同样的问题吗 我该如何修复它 class Admi
  • heroku 语言区域设置不工作 I18n::MissingTranslationData

    在我的本地电脑上一切正常 但在 heroku 上我收到错误 我的 Heroku 控制台 PC HOME PC c rails konkurranceportalen master heroku console Ruby console fo
  • Rails 查询连接关联表与别名

    我有一个模型Edge属于另一个模型Node通过不同的外键两次 def Edge lt ActiveRecord Base belongs to first class name Node belongs to second class na
  • S3 的 Rails 回形针默认图像

    我尝试在应用程序中使用default url 但我使用S3 存储图像 我不确定我需要在那里输入什么 URL 或者我是否必须创建一个假图像才能将所有内容放在那里 由于我的图像总是通过 S3 渲染 所以我不知道如果我只是在公共文件夹中放入一些默
  • Rails 4 与 MailCatcher 和 Devise gems

    我有一个带有 gem Devise 的应用程序 我需要通过电子邮件确认注册 在配置 环境 rb我添加了这个 ActionMailer Base delivery method smtp ActionMailer Base smtp sett
  • 如何访问 has_many :through 关联对象的相关连接模型而不需要额外的查询?

    这是我现在已经遇到过很多次的事情 我很想弄清楚如何做我想要的事情 或者构建并向 Rails 提交一个补丁来实现它 很多时候 在我的应用程序中 我会有一些看起来像这样的模型 class User lt ActiveRecord Base ha
  • 日期时间到 NSDate

    如何转换字符串2010 11 19T20 00 00Z进入一个NSDate object 我尝试过使用 dateFormatter setDateFormat yyyy MM ddTHH mm ssZ 但看起来我的自定义格式样式错误 PS
  • 为什么每个方法需要将其循环的值分配给变量?

    在 Rails 上工作 发现我对 Rails 的理解缺乏知识each method 不知道为什么each方法需要变量 message h2 h2 不确定为什么每个方法都需要变量 message 事实并非如此require它 你完全可以忽略它
  • Rails & Devise:如何在没有布局的情况下呈现登录页面?

    我知道这可能是一个简单的问题 但我仍在试图弄清楚Devise https github com plataformatec devise out 我想要render layout gt false在我的登录页面上 我怎样才能做到这一点Dev
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii
  • 如何在控制器中获取f.submit的名称参数?

    我创建了 form html erb 其中的编码如下 是的 我确实有两个相同表单的提交 并且它们都有 更新 和 销毁 等名称 当用户按下销毁按钮时 books controller 中的更新操作将被调用 并判断是 更新 还是 销

随机推荐