2015-04-26 19 views

回答

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,然后向他显示消息;阻止他更新相同的产品。当用户更新记录时,删除edited_by

但是,这是以成本。这里有很多角落案例:

  1. 用户可能会进入编辑页面并获取edited_by关联。但是绝对不要更新记录(因此绝不会给另一个用户更新产品)
  2. 如果出现某种逻辑异常,edited_by可能永远不会被重置。
  3. 涉及设计一个策略何时重置,如果情况#1发生。

因此,我建议使用Optimistic Locking来代替。您可以使用:lock_version为您的产品型号添加迁移。这将防止stale object在这种情况下被保存,防止这种冲突。
当用户2(或第一个)尝试更新旧记录时,它会引发异常ActiveRecord::StaleObjectError,您可以使用该记录处理该特效以显示自定义消息。

希望帮助:)

+0

我知道乐观锁定,但要当点击编辑和渲染自己编辑页面之前,但在不保存的产品来显示信息。 –

+0

我推断出这一点。但正如我在回答中所提到的那样,为此,您可能必须通过优化第一种方法,但它有它自己的缺点。如果没有它,当用户1打开/编辑页面时,你无法知道该内存对象,即使你这样做,你也永远不知道它是否会在一段时间内被更新。 – kiddorails

相关问题