Rails:ActiveRecord在哪里vs合并

时间:2018-05-23 13:43:39

标签: ruby-on-rails rails-activerecord active-relation

首先,我得到特定日期之间的审核状态。

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

现在我应该在下面应用'其中'或者'合并'。

@status = params[:status]

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

有人可以解释,我们应该何时使用merge代替where

1 个答案:

答案 0 :(得分:7)

您通常希望使用where,除非在特殊情况下 - 最常见的是,将条件应用于查询中的辅助(已加入)表。这是因为

  1. 它更短/更清晰/更具惯用性,
  2. merge有棘手的边缘情况:主要是组合了两个查询,但有些情况下,一方的价值会覆盖另一方。
  3. 鉴于此,即使您现有的条件也不需要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'