Как бы вы хотели, чтобы объект наблюдал / подписывался на себя, чтобы наблюдать за определенным полем? - PullRequest
3 голосов
/ 23 марта 2012

В моем обозревателе я пытаюсь написать метод для продукта, чтобы «взглянуть на себя», а затем найти тот же продукт, в котором поле :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 ]

1 голос
/ 23 марта 2012

Настройка механизма подписки / отношений. Многое можно сделать, чтобы улучшить производительность приведенного ниже примера, а также сделать его более модульным, но вы должны понять это.

приложение / модели / 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
1 голос
/ 23 марта 2012

Я думаю, что вам понадобится модель watched_products HMT, чтобы отслеживать, какие пользователи отслеживают какие продукты. В этой модели вы можете сохранить атрибут цены, на которую они смотрели, и название продукта.

Вы можете использовать эту модель для ежечасного поиска товаров с более низкой ценой и тем же именем, а затем уведомлять пользователя.

# 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...