1
想要在点击任何产品编辑页面时显示消息,如果有人 已经打开/在同一记录/页面中。如何避免多个用户页面在同一时间和同一个记录在rails?
如何跟踪用户对同一条记录的编辑动作的访问权限?最终,我想将消息显示为“有人正在编辑此产品”,以避免覆盖多个用户之间的 进程。
请分享你的想法。
想要在点击任何产品编辑页面时显示消息,如果有人 已经打开/在同一记录/页面中。如何避免多个用户页面在同一时间和同一个记录在rails?
如何跟踪用户对同一条记录的编辑动作的访问权限?最终,我想将消息显示为“有人正在编辑此产品”,以避免覆盖多个用户之间的 进程。
请分享你的想法。
这可能会增加关联天真的说:
class Product < ActiveRecord::Base
belongs_to :edited_by, class_name: 'User', foreign_key: 'edited_by_user_id'
end
class User < ActiveRecord::Base
has_many :edits, class_name: 'Product', foreign_key: 'edited_by_user_id'
end
然后:
/edit
页,设置product.edited_by
给该用户。/edit
页面。您可以检查是否设置了该产品的edited_by
,然后向他显示消息;阻止他更新相同的产品。当用户更新记录时,删除edited_by
。但是,这是以成本。这里有很多角落案例:
edited_by
关联。但是绝对不要更新记录(因此绝不会给另一个用户更新产品)edited_by
可能永远不会被重置。因此,我建议使用Optimistic Locking来代替。您可以使用:lock_version
为您的产品型号添加迁移。这将防止stale object在这种情况下被保存,防止这种冲突。
当用户2(或第一个)尝试更新旧记录时,它会引发异常ActiveRecord::StaleObjectError
,您可以使用该记录处理该特效以显示自定义消息。
希望帮助:)
我知道乐观锁定,但要当点击编辑和渲染自己编辑页面之前,但在不保存的产品来显示信息。 –
我推断出这一点。但正如我在回答中所提到的那样,为此,您可能必须通过优化第一种方法,但它有它自己的缺点。如果没有它,当用户1打开/编辑页面时,你无法知道该内存对象,即使你这样做,你也永远不知道它是否会在一段时间内被更新。 – kiddorails