Lottery Drawing SQL, escopo Rails :)

Criei o seguinte escopo ActiveRecord em meu aplicativo mais recente. Funciona como um charme 🙂 Você pode encontrar todas as correspondências de um intervalo (4-6) ou uma correspondência exata. Haverá um campo “jogos” em cada registro do relógio de loteria encontrado. Eu amo o ActiveRecord!

class LotteryTicket
has_many
:lottery_ticket_numbers

scope
:matching, ->(numbers, min_matches = 3, max_matches = 6) {
select
("lottery_tickets.id,
COUNT(lottery_ticket_numbers.number) AS matches"
)
.joins(:numbers)
.where("lottery_ticket_numbers.index, lottery_ticket_numbers.number)
IN ((0, ?), (1,?), (2,?), (3, ?), (4, ?), (5, ?)"
, *numbers)
.group("lottery_tickets.id")
.having("COUNT(lottery_ticket_numbers.number) >= ?", min_matches)
.having("COUNT(lottery_ticket_numbers.number) <= ?", max_matches)
}
end

Uso

LotteryTicket.matching(4,6).each do |ticket|
puts
"a winning ticket found with #{ticket.matches} matches}
}

Esquema de banco de dados

LotteryTicket
id


LotteryTicketNumber
id

lottery_ticket_id

number

index