我很困惑我應該如何制定這個範圍或方法。我有以下的關聯:創建方法或範圍以顯示較低的價格?
模型
class User
has_many :prices
has_many :products, :through => :prices
has_many :subscriptions, :foreign_key => :subscriber_id
end
class Product
has_many :prices
has_many :users, :through => :prices
end
class Price
# Table columns => :product_id, :cost, :user_id
belongs_to :user
belongs_to :product
belongs_to :store
has_many :subscriptions, :as => :subscribable
end
class Subscription
# Table columns => :product_id, :cost, :subscriber_id, :subscribable_id
# :subscribable_type
belongs_to :subscriber, :class_name => "User"
belongs_to :subscribable, :polymorphic => true
validates_uniqueness_of :subscribable_id, :scope =>
[ :subscriber_id, :subscribable_type]
end
所以方法應該是這樣的:
class Price
def self.lower_price
if self.product_id == self.subscription.product_id
if self.cost < self.subscription.cost
end
end
end
end
什麼這種方法是假設做的是隻顯示UserProducts
較低的價格屬於與Subscription
相同Product
,同時將其自身與訂閱price
字段進行比較以查看其是否更低。
我正在做這個對嗎?什麼需要解決?
編輯
class Price < ActiveRecord::Base
scope :for_product, lambda { |product_id| where(:product_id => product_id) }
scope :cheaper, lambda { |cost| where(["prices.cost < :cost", { :cost => cost } ]) }
end
class Subscription < ActiveRecord::Base
def cheaper_prices
Price.for_product(product_id).cheaper(cost)
end
end
PrivatePagesController:
def watch
@prices = Price.cheaper_prices.paginate(:page => params[:page], :per_page => 20).order('purchase_date DESC')
end
This gives me the error:
NoMethodError in PrivatePagesController#watch
undefined method `cheaper_prices' for #<Class:0x6f99210>
我也很困惑如何去做這件事。我必須複製'UserProduct'(或'Price')屬性,以便知道如何檢查便宜的價格。由於'Subscription'和'Price'具有相同的字段,我想我可以比較這兩個模型。所以'訂閱'將與所有的「價格」進行比較。 – LearningRoR 2012-04-12 14:58:42
另外,你對我的網站是正確的。用戶必須輸入新的價格。我改變了模型爲'價格',所以它從現在開始,並在未來。謝謝。 – LearningRoR 2012-04-12 15:00:20
是的。起初我沒有注意到認購實體有價格字段。我假設你的用戶界面的某個地方,你會得到訂閱。我的另一種方法是讓價格模型有辦法返回更便宜的價格。基本上,通過本答案中給出的範圍,任何可以提供產品ID和價格的對象都可以使用範圍。 – 2012-04-12 17:40:48