【问题标题】:Rails: ActiveRecord where vs mergeRails:ActiveRecord where vs merge
【发布时间】:2018-05-23 13:43:38
【问题描述】:

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

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

现在我应该应用“where”还是“merge”。

@status = params[:status]

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

谁能解释一下,我们什么时候应该使用merge 而不是where

【问题讨论】:

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


    【解决方案1】:

    您通常希望使用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'
    

    【讨论】:

    • 如果 .or() 不能正常工作,这将是 Rails 问题跟踪器的问题,但我是 quite confident 以上是准确的,会做你想做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多