gpt4 book ai didi

ruby-on-rails - 记录更改等待特权用户的批准;它就像版本控制与批准相结合

转载 作者:行者123 更新时间:2023-12-03 16:03:42 25 4
gpt4 key购买 nike

我有一个要求,在这些更改获得批准之前,记录的某些属性更改不会反射(reflect)在用户界面中。此外,如果对 approved 进行更改记录,用户将看到记录,因为它存在于 approval 之前。 .

我的第一次尝试...

是去一个版本控制插件,如 paper_trail , acts_as_audited等,并添加 approved归因于他们的版本模型。这样做不仅使我能够通过记录的版本“回滚”,而且应该允许我区分版本是否已被批准。

一段时间以来,我一直在研究这种思路,而我一直遇到的问题是在用户方面。也就是说,我如何查询 approved 的集合记录?我可以(并尝试)编写一些获取记录集合的辅助方法,然后遍历它们以找到记录的“批准”版本。我对此的主要提示是数据库命中数的增长速度。我的下一次尝试是做如下事情:

Version.
where(:item_type => MyModel.name, :approved => true).
group(:item_type).collect do |v|

# like the 'reify' method of paper_trail
v.some_method_that_converts_the_version_to_a_record
end

所以假设 some_method... call 没有访问数据库,我们最终得到了我们感兴趣的数据。我用这个方法遇到的主要问题是我不能使用这个“finder”作为范围。也就是说,我不能在这个查找中附加额外的范围来进一步缩小我的结果。例如,我的记录也可能有 cool仅显示记录的范围 :cool => true .理想情况下,我希望将我的记录查找为 MyModel.approved.cool ,但在这里我想我必须得到我的批准模型的集合,然后循环它们以获得 cool至少会导致在内存中无缘无故地初始化一堆记录。

我的下一次尝试...

涉及创建一种特殊类型的“待处理记录”,它基本上有助于对记录进行“潜在”更改。因此,在用户端,您可以像往常一样查找您想要的任何内容。每当待处理记录为 apply! (ed) 它只会对实际记录进行这些更改,一切都很好......除了大约 30 分钟,我意识到如果“管理员”希望在批准之前返回并为他的更改做出更多贡献,一切都会崩溃它。我想我唯一的选择是:
  • 强制管理员在进行其他更改之前批准所有更改(这不会很好......也不应该)。
  • 尝试从“待处理记录”模型中读取更改并将它们应用到现有记录而不保存。关于这个想法的某些东西听起来不太“正确”。

  • 我会 爱心有人对这个问题的意见。我已经与它搏斗了一段时间,我似乎无法找到感觉正确的方式。我喜欢遵循“如果你很难理解它,你可能做错了”的口头禅。

    这是踢我的尾部......

    最佳答案

    怎么样,创建一个关联:

    class MyModel < AR::Base
    belongs_to :my_model
    has_one :new_version, :class_name => MyModel

    # ...
    end

    进行编辑时,您基本上将现有对象克隆到一个新对象。关联现有对象和新对象,并设置 has_edits现有对象上的属性, pending_approval属性在新的。

    一旦管理员批准,您如何处理对象取决于您是否有其他依赖于原始模型 id 的关联。

    在任何情况下,您都可以将查询减少到:
    objects_pending_edits = MyModel.where("has_edits = true").all

    然后对于任何给定的编辑,您可以使用 obj.new_version 访问新的编辑。 .如果您真的想减少数据库流量,请立即加载该关联。

    关于ruby-on-rails - 记录更改等待特权用户的批准;它就像版本控制与批准相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6657451/

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