您如何观察/订阅自己观察某个领域的对象?

时间:2012-03-22 23:14:20

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

在我的观察者中,我正在尝试为产品编写一个“看自己”的方法,然后找到与:price字段唯一不同的相同产品。换句话说,我试图通知用户他们是否订购了价格较低的产品。

这是我的产品表:

create_table :products do |t|
  t.string  :name
  t.decimal :price
  t.integer :user_id
  t.integer :store_id
  t.boolean :watch_price
end

然后我有我的观察者:

class ProductObserver < ActiveRecord::Observer
  def after_update(product)
    if product.watch_price

    end
  end
end

因此,如果布尔值:watch_price为真,则用户已订阅该产品。我将它放在after_update(product)中,因为我希望用户能够选择watch_price复选框,然后立即执行Cron作业,然后在数据库上每小时执行一次。

我遇到的问题是让产品评估自己并搜索相同的产品,唯一的区别是:price字段。怎么会这样做?

在此先感谢,新手可以使用一些帮助!

2 个答案:

答案 0 :(得分:1)

我认为你需要一个HMT watched_products模型来跟踪哪些用户正在跟踪哪些产品。在该模型中,您可以保留他们观看的价格属性和产品名称。

您可以使用该模型每小时搜索具有相同名称的较低价格的产品,然后通知用户。

# Model
class WatchedProduct < ActiveRecord::Base
  belongs_to :user
  belongs_to :product
  # attributes name, price
end

# CRON/Rake task
for watched_product in WatchedProduct.all
 for product in Product.find_by_name(watched_product.name)
   if watched_product.price > product.price
      # notify user
      # update the new watched price of the cheaper product
   end
 end
end

显然可以进行更多优化,但你明白了。

您可能希望使用另一个cron作业过期观看产品。

答案 1 :(得分:1)

建立订阅机制/关系。可以做很多工作来提高下面示例的性能,并使其更加模块化,但您应该明白这一点。

应用程序/模型/ product.rb

class Product < ActiveRecord::Base
  has_many :subscriptions
  has_many :subscribers, :through => :subscriptions, :class_name => 'User'
end

应用程序/模型/ user.rb

class User < ActiveRecord::Base
  has_many :subscriptions
  has_many :products, :through => :subscriptions

  def notify_of_price_drop(product, original_price)
    # notify somehow
  end
end

应用程序/模型/ subscription.rb

class Subscription < ActiveRecord::Base
  # be sure to add snapshot_price field to the subscriptions table in your migration
  belongs_to :product
  belongs_to :subscriber, :class_name => 'User'
end

应用程序/模型/ product_observer.rb

class ProductObserver < ActiveRecord::Observer
  def after_update(product)
    product.subscriptions.each do |subscription|
      if subscription.snapshot_price < product.price
        subscription.user.notify_of_price_drop(product, subscription.snapshot_price)
      end
    end
  end
end