Rails: ActiveRecord, где против слияния - PullRequest
0 голосов
/ 23 мая 2018

Во-первых, я получаю статусы проверки между определенными датами.

date_range = Date.parse(@from_date).beginning_of_day..Date.parse(@to_date).end_of_day

@review_statuses = ReviewStatus.where(updated_at: date_range)

Далее мне нужно применить условие 'И'.

    @review_cycle = params[:review_cycle]

    if @review_cycle.present?
      @review_statuses = @review_statuses.merge(
                           ReviewStatus.where(evidence_cycle: @review_cycle)
                                       .or(ReviewStatus.where(roc_cycle: @review_cycle)))
    end

Теперь для нижеследующего следуетЯ применяю «где» или «слияние».

@status = params[:status]

@review_statuses.where(evidence_status: :pass, roc_status: :pass) if @status == 'pass'

Может кто-нибудь объяснить, когда мы должны использовать merge вместо where?

1 Ответ

0 голосов
/ 23 мая 2018

Обычно вы хотите использовать where, за исключением особых случаев - чаще всего для применения условий к дополнительной (объединенной) таблице в запросе.Это потому, что

  1. он короче / четче / более идиоматичен, а
  2. merge имеет сложные граничные случаи: он в основном объединяет два запроса, ноэто ситуации, в которых значение одной стороны просто переопределит другую.

Учитывая, что даже вашему существующему условию не нужно merge:

# Unchanged
date_range = Date.parse(@from_date).beginning_of_day..Date.parse(@to_date).end_of_day
@review_statuses = ReviewStatus.where(updated_at: date_range)

# direct #where+#or over #merge
@review_cycle = params[:review_cycle]
if @review_cycle.present?
  @review_statuses = @review_statuses.where(evidence_cycle: @review_cycle).or(
                       @review_statuses.where(roc_cycle: @review_cycle))
end

# more #where
@status = params[:status]
@review_statuses = @review_statuses.where(evidence_status: :pass, roc_status: :pass) if @status == 'pass'
...