Rails 3 с использованием sum () в предложении where - PullRequest
2 голосов
/ 04 ноября 2011

У меня есть небольшая проблема с предложением where.

PurchasePosition.where(:purchase_order_id => 996).where('sum(pallet_purchase_position_assignments.quantity) < purchase_positions.quantity').includes(:pallet_purchase_position_assignments)

Мои модели:

class PurchasePosition < ActiveRecord::Base
  has_many :pallet_purchase_position_assignments, :class_name => "PalletPurchasePositionAssignment"
  has_many :pallets, :class_name => "Pallet", :through => :pallet_purchase_position_assignments
end

class Pallet < ActiveRecord::Base
  has_many :pallet_purchase_position_assignments, :class_name => "PalletPurchasePositionAssignment"
  has_many :purchase_positions, :class_name => "PurchasePosition", :through => :pallet_purchase_position_assignments
end

class PalletPurchasePositionAssignment < ActiveRecord::Base
  belongs_to :pallet, :class_name => "Pallet", :foreign_key => "pallet_id"
  belongs_to :purchase_position, :class_name => "PurchasePosition", :foreign_key => "purchase_position_id"
end

Все, что я получаю, это ошибка Mysql

ActiveRecord::StatementInvalid: Mysql2::Error: Invalid use of group function

Я абсолютно не знаю, в чем заключается моя ошибка: - /

У кого-нибудь есть решение моей проблемы?

Майкл

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Ошибка, которую вы получаете, заключается в том, что вы не используете предложение group by.

В mysql и большинстве баз данных, если вы хотите использовать суммирование (или любую группу по столбцу) в выборе, чем вы используете предложение HAVING, а не предложение WHERE

PurchasePosition.where(:purchase_order_id => 996).having('sum(pallet_purchase_position_assignments.quantity) < purchase_positions.quantity').includes(:pallet_purchase_position_assignments).sum("pallet_purchase_position_assignments.quantity

Например, если у меня есть таблица типа:

 create_table "leaders", :force => true do |t|
   t.integer  "leaderable_id"
   t.string   "leaderable_type"
   t.integer  "county_id"
   t.integer  "us_state_id"
   t.integer  "recruits"
   t.integer  "hours"
   t.datetime "created_at"
   t.datetime "updated_at"
   t.datetime "last_run_dt"
 end

Тогда я могу создать запрос, подобный этому

Leader.having("sum(hours) > 150").group(:leaderable_type).sum(:hours)

Я не уверен, что у меня есть правильный синтаксис для вашего запроса, но вы должны быть в состоянии исправить его, используя предложение has и предложение group.

0 голосов
/ 04 ноября 2011

Вы не можете использовать функцию SUM () в предложении where .where('sum(pallet_purchase_position_assignments.quantity) < purchase_positions.quantity') - это вызывает ошибку.

предложение должно быть похоже на where purchase_positions.quantity > (select sum(purchase_positions.quantity))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...