Rails эквивалент SQL

#ruby-on-rails

#ruby-on-rails

Вопрос:

Учитывая следующие модели:

 class PeriodBilling < ActiveRecord::Base

  belongs_to :appcode
  belongs_to :period
  belongs_to :sla
  belongs_to :unit_type
  belongs_to :dpc_employee
  belongs_to :general_ledger

end

class GeneralLedger < ActiveRecord::Base

  has_many :appcodes
  has_many :sla_task_details
  belongs_to :expense_category
  has_many :period_billings
  has_many :expected_billings


end
  

Как бы мне найти следующий SQL-эквивалент в Rails, для отображения в виде матрицы с точками внизу слева и general_ledgers сверху, с суммой (pb.current_amt) в соответствующих полях?

 select pb.pe_number, gl.general_ledger_number, sum(pb.current_amt)
from period_billings pb, general_ledgers gl
where pb.sla_id = 21
and pb.general_ledger_id = gl.id
group by pb.pe_number, gl.general_ledger_number
  

В терминах Active Record это своего рода то, что я пытаюсь найти:

 @sla = Sla.find(params[:id])
@period_billings = PeriodBilling.where("sla_id = ?", @sla.id).group_by(amp;:general_ledger_id)
@billing_sum = @period_billings.inject(0){|sum,billing| sum billing.current_amt}
  

Итак, я хочу найти все period_billings для выбранного sla, сгруппированные по general_ledger_id, чтобы получить сумму period_billing.current_amt для этих записей. Затем я хочу поместить 12 периодов сбоку, чтобы показать суммированную сумму в соответствующем столбце general_ledger сверху.

Заранее спасибо!!! 🙂

Комментарии:

1. в активной записи можно использовать определенные запросы, проверьте guides.rubyonrails.org/active_record_querying.html

2. Да, но я новичок, и у меня возникли проблемы с отображением результатов в таблице, подобной матрице…

3. Посмотрим, сможете ли вы еще немного переварить вопрос. Это немного сложно для меня или большинства других на SO для просеивания. Особенно запрос… попробуйте выразить это в терминах ваших активных моделей записей и атрибутов.

4. Хорошо, вот мой взгляд на это. Я пытался использовать активные условия записи раньше, но никто не ответил, вероятно, потому, что я такой новичок…

5. Я отредактировал свой оригинальный пост, чтобы включить мой удар по эквиваленту активной записи … спасибо.

Ответ №1:

Просто небольшая попытка того, что я предлагаю вам сделать. Некоторые вещи лучше предназначены для прямого sql, и когда это возникает, как вы запрашиваете, лучше всего просто использовать sql.

 ActiveRecord::Base.connection.execute <<-EOF
select pb.pe_number, gl.general_ledger_number, sum(pb.current_amt)
from period_billings pb, general_ledgers gl
where pb.sla_id = 21
and pb.general_ledger_id = gl.id
group by pb.pe_number, gl.general_ledger_number
EOF