Я думаю, что использование цепочек прицелов сделает его более читабельным:
# in app/models/offer.rb
scope :without_end, -> { where(ended: nil) }
scope :still_valid, -> { where('started_at < :now AND offers.ended_at >= :now', now: Time.current) }
И будет использоваться так:
Offer.still_valid.or(Offer.without_end)