#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))