Du kan kontrollera vilka artiklar det finns rekord för varje år. Du kan göra det genom att kontrollera om antalet distinkta år för varje artikel är lika med det totala antalet år (med COUNT DISTINCT
):
number_years = params[:end_year].to_i - params[:start_year].to_i + 1
@sale_averages = Sale.joins(:shops, :items)
.select('items.name, AVG(sale.price) as price')
.where("EXTRACT(year from season_year) BETWEEN #{params[:start_year]} AND #{params[:end_year]}")
.where('shops.name': params[:select_shop])
.group('items.name')
.having("(COUNT(DISTINCT(EXTRACT(year from season_year))) = #{number_years})")
Jag har också använt BETWEEN
istället för <
och > .Jag tror att du vill gruppera efter artikelnamn istället för butik (som det var i din ursprungliga fråga).