在我的观察者中,我正在尝试为产品编写一个“看自己”的方法,然后找到与: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
字段。怎么会这样做?
在此先感谢,新手可以使用一些帮助!
答案 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)
建立订阅机制/关系。可以做很多工作来提高下面示例的性能,并使其更加模块化,但您应该明白这一点。
class Product < ActiveRecord::Base
has_many :subscriptions
has_many :subscribers, :through => :subscriptions, :class_name => 'User'
end
class User < ActiveRecord::Base
has_many :subscriptions
has_many :products, :through => :subscriptions
def notify_of_price_drop(product, original_price)
# notify somehow
end
end
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
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