Rails 3 использует sum() в предложении where

#mysql #ruby-on-rails-3 #activerecord

#mysql #ruby-on-rails-3 #activerecord

Вопрос:

У меня небольшая проблема с моим предложением 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
  

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

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

Майкл

Ответ №1:

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

В mysql и большинстве баз данных, если вы хотите использовать суммирование (или любую группу по столбцу) в select, вы используете предложение 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)
  

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

Ответ №2:

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

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