如何在rails中同时避免多个用户页面访问和相同记录?

时间:2015-04-26 14:56:36

标签: ruby ruby-on-rails-3 locking tracking

如果有人点击任何产品编辑页面,则会显示一条消息 已打开/在同一记录/页面中。

如何跟踪用户对同一记录的编辑操作的访问权限?最终我想将消息显示为“有人已编辑此产品”以避免覆盖 多个用户之间的过程。

请分享您的想法。

1 个答案:

答案 0 :(得分:2)

对此的天真解决方案可能是添加一个关联说:

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

然后:

  1. 首先来到/edit页面,将product.edited_by设置为该用户。
  2. 第二位用户访问/edit页面。您可以检查是否设置了该产品的edited_by,然后向他显示该消息;阻止他更新同一产品。
  3. 当用户更新记录时删除edited_by
  4. 但这是成本。围绕这个问题有很多个案例:

    1. 用户可能会进入编辑页面并获得edited_by关联。但永远不要更新记录(因此永远不会让其他用户更新产品)
    2. 如果出现某些逻辑异常,edited_by可能永远不会被重置。
    3. 如果发生情况#1,则涉及设计何时重置的策略。
    4. 因此,我建议使用Optimistic Locking代替。您可以为产品型号添加:lock_version的迁移。这样可以防止在此方案中保存stale object,从而防止此类冲突 用户#2(或第一个)尝试更新旧记录时会引发异常ActiveRecord::StaleObjectError,您可以通过处理该记录来显示自定义消息。

      希望有所帮助:)