2012-04-10 4 views
3

Я не уверен, что здесь происходит. У меня есть объем, который я пытаюсь создать, который работает с моей ассоциацией:рельсы: используя столбцы ассоциированной модели в: где

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 способ не делает точно, что вы думаете. Запасной joins для includes и он должен делать то, что вы имели в виду:

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 переводит к JOIN в результате запроса SQL, так что вы можете выполнить ИНЕКЕ на присоединяемой таблицы , include просто запрашивает Active Record для выполнения другого запроса, чтобы выбрать все связанные записи в данной таблице. Если вы делаете оба вместе, Active Record создает (довольно длинный) «все-в-одном», который соединяет обе таблицы и использует результаты для создания обоих наборов объектов.

+0

Он по-прежнему дает мне такую ​​же ошибку. странный. – LearningRoR

+0

Я думаю, что все это время он не работал, потому что отсутствовал период '.'! Я чувствую себя глупым. Спасибо, сэр! – LearningRoR

Смежные вопросы