Лучший метод подсчета связанного объекта из группы объектов

#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 Если вы не возражаете, пожалуйста, также поддержите этот ответ, который поможет другим пользователям, столкнувшимся с той же проблемой