Переписать запрос ActiveRecord в Arel - PullRequest
1 голос
/ 29 января 2020

Я только начал работать с ARel. Мне трудно преобразовать этот сложный AR-запрос в Arel:

    Offer.where(
      "offers.ended_at IS NULL OR offers.started_at < ? AND offers.ended_at >= ?",
      Time.zone.now, Time.zone.now
    )

Я думаю, что наличие этого в Arel улучшит читабельность

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Я думаю, что использование цепочек прицелов сделает его более читабельным:

# 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)
1 голос
/ 29 января 2020

Это должно работать:

offers = Offer.arel_table
offers_with_nil_ended_at = offers[:ended_at].eq(nil)
offers_within_range = offers[:started_at].lt(Time.zone.now).and(
  offers[:ended_at].gteq(Time.zone.now)
)

Offer.where(offers_with_nil_ended_at.or(offers_within_range))

...