16

首先,我正在获取特定日期之间的审核状态。

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

@review_statuses = ReviewStatus.where(updated_at: date_range)

接下来,我需要应用“AND”条件。

    @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

现在对于以下内容,我应该应用“where”还是“merge”。

@status = params[:status]

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

有人可以解释一下,我们什么时候应该使用merge而不是where

4

1 回答 1

8

您通常希望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'
于 2018-05-23T13:58:23.947 回答