Ich bin verwirrt darüber, wie ich diesen Anwendungsbereich oder diese Methode machen sollte. Ich habe folgende Verbände:Erstellen einer Methode oder eines Bereichs, um niedrigere Preise anzuzeigen?
Modelle
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
So soll die Methode sein, so etwas wie:
class Price
def self.lower_price
if self.product_id == self.subscription.product_id
if self.cost < self.subscription.cost
end
end
end
end
Was diese Methode Show zu tun ist wohl nur niedrigere Preise von UserProducts
, die zu gehören das gleiche Product
wie die Subscription
, während sie sich mit den Abonnements price
Feld vergleichen, um zu sehen, ob es niedriger ist.
Mache ich das richtig? Was muss behoben werden?
EDIT
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>
Ich bin auch verwirrt wie das weitergeht. Ich musste die 'UserProduct' (oder 'Price') Attribute duplizieren, um dann nach günstigeren Preisen zu suchen. Da die "Subscription" und "Price" dieselben Felder haben, kann ich diese zwei Modelle vergleichen. Das "Abonnement" würde also mit allen "Preisen" verglichen werden. – LearningRoR
Auch Sie haben Recht mit meiner Website. Die Benutzer müssen neue Preise eingeben. Ich habe das Modell geändert, um "Preis" zu sein, also macht es jetzt und in der Zukunft. Vielen Dank. – LearningRoR
Ja. Zuerst habe ich nicht bemerkt, dass die Subscription-Einheit ein Preisfeld hatte. Ich nehme an, dass Sie in Ihrer Benutzeroberfläche das Abonnement erhalten. Mein anderer Ansatz war, dass das Preismodell die Methode hat, die günstigeren Preise zurückzugeben. Mit den in dieser Antwort angegebenen Bereichen kann jedes Objekt, das die Produkt-ID und einen Preis bereitstellen kann, die Bereiche verwenden. –