记录更改由特权用户批准; 它就像版本化和批准一样

Iam*_*ery 5 activerecord ruby-on-rails

我要求在对这些更改进行批准之前,对记录的某些属性更改不会反映在用户界面中.此外,如果对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
Run Code Online (Sandbox Code Playgroud)

因此,假设some_method...调用没有访问数据库,我们最终得到了我们感兴趣的数据.我遇到的主要问题是我不能使用这个"finder"作为范围.也就是说,我无法在此查找中添加其他范围以进一步缩小我的结果范围.例如,我的记录也可能cool只有显示记录的范围:cool => true.理想情况下,我想查看我的记录MyModel.approved.cool,但在这里我想我必须得到我的批准模型的集合,然后循环它们cool将导致至少在内存中初始化一堆记录没理由.

我的下一次尝试......

涉及创建一种特殊类型的"待处理记录",它基本上有助于记录的"潜在"变化.因此,在用户端,您可以像往常一样查找任何您想要的内容.每当一个待处理的记录被apply!编辑时,它只会对实际记录进行那些更改,并且一切都很好...... 除了大约30分钟之外,我意识到如果"管理员"希望返回并贡献更多,这一切都会崩溃在批准之前对他的改变.我想我唯一的选择是:

  1. 强制管理员批准所有更改,然后再制作其他更改(这不会很好...也不应该).

  2. 尝试从"待处理记录"模型中读取更改并将其应用于现有记录而不保存.关于这个想法的东西听起来并不是很"正确".

喜欢在这个问题上某人的输入.我已经和它搏斗了一段时间,我似乎无法找到感觉正确的方式.我喜欢生活在"如果它难以理解它,你可能做错了"的口头禅.

这是踢我的尾巴......

Ste*_*oss 5

怎么样,创建一个关联:

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

  # ...
end
Run Code Online (Sandbox Code Playgroud)

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

管理员批准后如何处理对象取决于您是否有其他依赖于原始模型ID的关联.

无论如何,您可以将查询减少到:

objects_pending_edits = MyModel.where("has_edits = true").all
Run Code Online (Sandbox Code Playgroud)

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