Puede verificar para qué elementos hay un registro cada año. Puede hacerlo verificando si el número de años distintos para cada artículo es igual al total de años (usando 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})")
También he usado BETWEEN
en lugar de <
y >
.Creo que desea agrupar por nombre de artículo en lugar de tienda (como estaba en su consulta original).