【问题标题】:Rails: working on temporary instance between requests and then commit changes to databaseRails:在请求之间处理临时实例,然后将更改提交到数据库
【发布时间】:2015-01-16 21:33:49
【问题描述】:

我已经阅读了Rails - How do I temporarily store a rails model instance? 和类似的问题,但我找不到成功的答案。

假设我有模型Customer,它可能包含大量附加信息(简单属性、其他表中的数据通过has_many 关系等...)。我希望应用程序的用户使用单个 Save 按钮访问单个页面中的所有数据。当用户对数据进行更改(即他更改简单属性、添加或删除has_many 项目、...)时,我希望应用程序更新模型,但不提交对数据库的更改 .只有当用户点击Save时,模型才必须被提交。

为了实现这一点,我需要 Rails 在 HTTP 请求之间保存模型。此外,两个不同的用户可能同时更改模型的数据,因此这些临时实例应该绑定到 Rails 会话。

有什么方法可以实现吗?这真的是个好主意吗?而且,如果不是,如何设计一个 Web 应用程序,其中模型中的更改不能保留在浏览器中,而是保留在服务器中,直到用户想要提交它们?

编辑

根据用户smallbutton.com的建议,我想知道serializing the model instance to a temporary file(其路径将存储在session哈希中),然后在每次新请求到达时重新加载它,会做的伎俩。它适用于所有情况吗?在序列化/反序列化过程中是否会丢失任何信息?

【问题讨论】:

    标签: ruby-on-rails database


    【解决方案1】:

    由于 HTTP 请求是无状态的,因此您需要在请求之间进行某种存储。会话是在请求之间存储数据的最简单方法。至于您,会话还不够,因为您需要多个用户访问它。

    我看到了两种实现目标的方法:

    1) 获得一些快速的外部数据存储,例如键值服务器(redis,或任何您喜欢的 http://nosql-database.org/),您可以通过序列化/反序列化(例如 JSON)放置对象。 根据您的设计选择和数据模型,这可能会很快,但这是更难的方法。

    2) 只需像往常一样将对象存储在数据库中并对其进行版本控制:(https://github.com/airblade/paper_trail)。然后你可以在人们点击保存按钮时存储一个时间戳,你可以随时回到这个状态。我猜这将是更简单的方法,但根据您的数据模型更改的大小可能会慢一些(但我认为它会这样做)

    编辑:如果您需要用户之间的实时协作,您可能应该看看 Firebase 之类的东西

    EDIT2:回答您的第二个问题,是否可以将数据放入文件中:

    当然可以。但是,如果多人编辑,您将需要某种锁定以防止数据丢失。如果您选择 1),您也将需要它,但像 redis 这样的工具已经包含锁来实现您的目标(例如 redis-semaphore)。根据您的数据,您可能需要构建一些逻辑来合并不同用户的不同更改。

    3) 我想到的另一种方法是使用 Javascript 进行所有编辑并将其保存在一个 db-transaction 中。这适用于 firebase 等同步工具(或您自己通过 Rails 流 API 进行的同步)

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 2015-04-28
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2010-12-01
      • 1970-01-01
      相关资源
      最近更新 更多