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