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)

这里有什么问题?

4

1 回答 1

3

includes方法并不完全按照您的想法进行。代替它应该joinsincludes你的意思:

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 查询中转换为 a JOIN,因此您可以在连接表上执行 WHERE 子句。 include只是要求 Active Record 执行另一个查询以选择给定表中的所有相关记录。如果你同时做这两件事,Active Record 会创建一个(相当长的)一体机,它同时连接两个表并使用结果来创建两组对象。

于 2012-04-11T01:46:19.907 回答