Rails:ActiveRecord哪里合并 [英] Rails: ActiveRecord where vs merge

查看:98
本文介绍了Rails:ActiveRecord哪里合并的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我要获取特定日期之间的评论状态.

First, I am getting the review statuses between particular dates.

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"条件.

Next, I need to apply an 'AND' condition.

    @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".

Now for the below should I apply a 'where' or 'merge'.

@status = params[:status]

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

有人可以解释一下,什么时候应该使用merge代替where?

Can someone explain, when should we use merge instead of where?

推荐答案

除特殊情况外,您通常要使用where -最常见的情况是将条件应用于查询中的辅助(联接)表.这样吧

You generally want to use where except in special circumstances -- most commonly, to apply conditions to a secondary (joined) table in the query. This is becase

  1. 更短/更清晰/更惯用,
  2. merge有一些棘手的情况:它主要是结合了两个查询,但是在某些情况下,一侧的值会覆盖另一侧.
  1. it's shorter / clearer / more idiomatic, and
  2. merge has tricky edge cases: it mostly combines the two queries, but there are situations where one side's value will just override the other.

鉴于此,即使您现有的情况也不需要merge:

Given that, even your existing condition doesn't need 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'

这篇关于Rails:ActiveRecord哪里合并的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆