@vanderv
Ruby on Rails

[RoR] Как организовать итерацию в скоупе метода where?

scope :with_size_ids, lambda { |size_ids|
    sizes = Catalog::Size.find(size_ids)
    sizes.map do |size|
      where('product.size >= ? AND product.size <= ? ', size.max_from, size.max_to)
    end
  }

Есть база размеров, которая задает диапазон чисел (от и до). На входе скоуп получает массив id этих размеров. На выходе должна быть выборка подходящих под эти размеры записей.
По итогу запрос должен быть аналогичен такому:
where('product.size >= ? AND product.size <= ? ', 0, 100).where('product.size >= ? AND product.size <= ? ', 200, 300) # И так далее
  • Вопрос задан
  • 2440 просмотров
Решения вопроса 1
Vakiliy
@Vakiliy
Можно так:
scope :with_size_ids, lambda { |size_ids|
  sizes = Catalog::Size.where(id: size_ids).pluck(:max_from, :max_to)
  ranges = sizes.inject([]){|o, i| o << Range.new(*i)}
  where(size: ranges)
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы