2012-04-10 9 views
0

Ich habe zwei Modelle:Wie erstellt man einen Bereich, der die Zuordnung vergleicht?

class Subscription 
    belongs_to :subscriber, :class_name => "User" 
    belongs_to :subscribable, :polymorphic => true 
end 

class Product 
    belongs_to :user 
    has_many :subscriptions, :as => :subscribable, :dependent => :destroy 
end 

create_table :products do |t| 
    t.string :name 
    t.decimal :price 
    t.decimal :cost_per_unit 
    t.integer :user_id 
end 

create_table :subscriptions do |t| 
    t.string :name 
    t.decimal :price 
    t.decimal :cost_per_unit 
    t.integer :subscriber_id 
    t.integer :subscribable_id 
    t.string :subscribable_type 
end 

In meinem Modell, Ich versuche, einen Rahmen zu machen, die die price oder cost_per_unit der Product zum Subscription vergleicht. Ich weiß einfach nicht, wie ich das in SQL schreiben würde. So sollte es so etwas wie sein:

class Product 
    def self.lower_prices 
    where(self.price < self.subscription.price OR self.cost_per_unit < self.subscription.cost_per_unit) 
    end 
end 

Wie würde ich das schreiben?

Antwort

1

Sie müssen ein sql-Fragment in der where-Klausel angeben sowie einen Join verwenden, um die Daten aus der Abonnementtabelle abzurufen.

Ich habe keinen Zugriff auf meine Entwicklungsmaschine, um dies zu testen, aber das sollte hoffentlich in die richtige Richtung zeigen.

class Product 
    has_many :subscriptions, :as => :subscribable, :dependent => :destroy 
    self.lower_prices 
    Product.includes(:subscription). 
    where("products.price < subscriptions.price OR products.cost_per_unit < subscriptions.cost_per_unit") 
    end 
end 
Verwandte Themen