首先,我得到特定日期之间的审核状态。
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
?
答案 0 :(得分:7)
您通常希望使用where
,除非在特殊情况下 - 最常见的是,将条件应用于查询中的辅助(已加入)表。这是因为
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'