2012-04-10 7 views
3

ここで何が起こっているのか分かりません。私は私の協会と連携し、その作成しようとしている範囲を持っている:rails:関連付けられているモデルの列を使用しています。

class Subscription < ActiveRecord::Base 
    belongs_to :subscriber, :class_name => "User" 
    belongs_to :subscribable, :polymorphic => true 
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 

class Product < ActiveRecord::Base 
    has_many :subscriptions, :as => :subscribable, :dependent => :destroy 

    def self.lower_prices 
     Product.includes(:subscriptions). 
     where("products.price < subscriptions.price OR products.cost_per_unit < subscriptions.cost_per_unit") 
    end 
end 

私はサブスクリプションに製品の低価格を比較しようとしているが、これは私にエラーを与える:

ActiveRecord::StatementInvalid in Pages#subscribed_products 

PGError: ERROR: missing FROM-clause entry for table "subscriptions" 
LINE 1: ... WHERE (user_id != 2) AND (products.price < subscripti... 
                  ^
: SELECT COUNT(*) FROM "products" WHERE (user_id != 2) AND (products.price < subscriptions.price OR products.cost_per_unit < subscriptions.cost_per_unit) 

何が間違っていますか?

+0

「def」が誤って入力されていますか? –

+0

@DaveNewtonうん、それを忘れてしまった。 – LearningRoR

+0

クエリに関連するモデルサブスクリプションが表示されません。モデル名が正しいことを確認してください。 – naren

答えて

2

includesの方法は、あなたの考えを正確には行いません。 includesためjoinsを代入し、それはあなたが何を意味するか実行する必要があります。

Product.joins(:subscriptions). 
     where("products.price < subscriptions.price OR products.cost_per_unit < subscriptions.cost_per_unit") 

または多分を:

Product.includes(:subscriptions).joins(:subscriptions). 
     where("products.price < subscriptions.price OR products.cost_per_unit < subscriptions.cost_per_unit") 

joinsは、結果のSQLクエリでJOINに変換、あなたが参加し、テーブル上のWHERE句を実行することができます。 includeは、アクティブレコードに対して、指定されたテーブル内のすべての関連レコードを選択する別のクエリを実行するように要求します。両者を併用すると、Active Recordは2つのテーブルを結合し、その結果を使用して両方のオブジェクトセットを作成する(むしろ長い)オールインワンを作成します。

+0

それでも私には同じエラーが表示されます。奇妙な。 – LearningRoR

+0

私はこの間ずっとピリオド '.'が欠けていたので、うまくいきませんでした!私は気が気になりません。ありがとうございます! – LearningRoR

関連する問題