#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