#ruby-on-rails
#ruby-on-rails
Вопрос:
Как можно подсчитать количество элементов, являющихся билетами, в следующем сценарии? Столбец ticket находится в таблице Items.
Я пытаюсь захватить группу погашений, а затем подсчитать количество элементов, которые являются «билетами» для этой группы погашений.
class Item < ActiveRecord::Base
has_many :redemptions
class Redemption < ActiveRecord::Base
belongs_to :item
#This method works, but is there a much better way?
def tickets_sold
my_tickets_sold = 0
@redemptions = Redemption.where(state: "valid")
redemptions.each do |redemption|
if redemption.item.ticket == true
my_tickets_sold = my_tickets_sold 1
end
end
my_tickets_sold
end
Ответ №1:
Да, вы можете сделать это лучше, вы можете использовать один из 3 способов
1) Добавьте ассоциаты для получения записей о проданных билетах
has_many :sold_tickets, -> { left_outer_joins(:item).where("state = 'valid' AND items.ticket = true ") }
2) Добавьте область для выборки количества проданных билетов
scope :sold_tickets_count, -> { left_outer_joins(:item).where("state = 'valid' AND items.ticket = true ").count }
3) Добавьте метод экземпляра в модель для получения количества проданных билетов
def sold_tickets_count
left_outer_joins(:item).where("state = 'valid' AND items.ticket = true ").count
end
Комментарии:
1. Спасибо @vishal! Объединения сработали. Я пошел дальше и использовал это в моем случае:
@redemptions.joins(:item).where("state = 'valid' AND items.ticket = true ").count
2. @TannerBrandt Если вы не возражаете, пожалуйста, также поддержите этот ответ, который поможет другим пользователям, столкнувшимся с той же проблемой