Rails 3 问题 - 在特定时间锁定行

发布于 2024-10-24 19:40:31 字数 145 浏览 1 评论 0原文

我正在构建一个 Rails 3 应用程序,其中销售数量有限的商品。我正在寻找一种方法来将商品保留特定的时间,以便当有人选择商品时,他们有时间在其他人之前购买它。我已经做了一些关于行锁定的研究,但到目前为止还没有找到可用的方法来指定时间。

感谢您的任何帮助或想法

I'm building a rails 3 app in which it sells a limited number of items. I'm looking for a way to hold an item for a specific amount of time so that when someone selects an item, they have time to purchase it before someone else can purchase it before them. I have done some research as to row locking but haven't found a usable method thus far for specifying a time.

Thanks for any help or ideas

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月下伊人醉 2024-10-31 19:40:31

这是一种典型的工作流模式,您在一段时间内获取一个对象。您可以通过实施应用程序级锁轻松实现这一点。

1) 将锁定字段添加到模型中。

locker_id
lock_until

2) 现在您可以在 Product 模型中实现此逻辑。

class Product

  belongs_to :locker, :class_name => "User",
           :condition => lambda { {:conditions => ["lock_until < ? ", Time.now]}}

  def locked?
    !lock_until.nil? and lock_until > Time.now
  end

  def lock_for_duration(usr, duration=10.minutes)
    return false if locked?
    self.locker_id = user.id
    self.lock_until = duration.from_now
    self.save   
  end

  def release_lock
    return true unless locked?
    self.locker_id = nil
    self.lock_until = nil
    self.save    
  end
end

以下是如何使用它:

usr = User.first
product.lock_for_duration(usr, 30.minutes)
product.locked?
product.locker?

This is a typical workflow pattern, where you acquire an object for a duration. You can achieve this easily by implementing application level locks.

1) Add lock fields to the model.

locker_id
lock_until

2) Now you can implement this logic in the Product model.

class Product

  belongs_to :locker, :class_name => "User",
           :condition => lambda { {:conditions => ["lock_until < ? ", Time.now]}}

  def locked?
    !lock_until.nil? and lock_until > Time.now
  end

  def lock_for_duration(usr, duration=10.minutes)
    return false if locked?
    self.locker_id = user.id
    self.lock_until = duration.from_now
    self.save   
  end

  def release_lock
    return true unless locked?
    self.locker_id = nil
    self.lock_until = nil
    self.save    
  end
end

Here is how to use this:

usr = User.first
product.lock_for_duration(usr, 30.minutes)
product.locked?
product.locker?
瀟灑尐姊 2024-10-31 19:40:31

我建议设置一个 locked_until 时间戳,每当有人尝试购买其中一件商品时都会检查该时间戳。如果过去没有任何商品具有 locked_until 时间,则所有商品均“售完”。对于商品的实际销售,我将有一个 sold 布尔字段。

I would recommend setting a locked_until timestamp that's checked whenever someone attempts to buy one of these items. If there are no items with a locked_until time in the past, then all items are "sold out". For actual selling of the items, I would have a sold boolean field.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文