Je zou kunnen controleren voor welke items er elk jaar een record is. U kunt dat doen door te controleren of het aantal verschillende jaren voor elk item gelijk is aan het totaal van jaren (met behulp van 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})")
Ik heb ook BETWEEN
. gebruikt in plaats van <
en >
.Ik denk dat je wilt groeperen op itemnaam in plaats van op winkel (zoals in je oorspronkelijke zoekopdracht).