Rails有可能得到这样的东西:
scope = MyModel.filter_by({status: 1, color: 'red', user_id: 1})
count_status_2 = scope.clone.unscope(where: :status).where(status: 2)
count_status_3 = scope.clone.unscope(where: :status).where(status: 3)
我想通过filter params查询所有记录,并且使用几乎相同的过滤器但不同的状态获取其他结果的计数。上面的示例不起作用,它导致SQL中的'status' = 3
单个查询,因此clone
实际上并未在此处进行克隆。
谢谢。
UPD。
我不仅要修改where
,还要修改整个范围。
让我们假装有一些男人的名单:
men_scope = User.joins(:jobs, :city).where(sex: 0, age: 20).order(name: :desc)
我们还希望在该列表旁边显示women
按钮,其中包含相同过滤器的女性数量。我想要像
women_count = men_scope.uscope(where: :sex).where(sex: 1).count
但这确实会改变原来的men_scope
,所以我最终得到的是女性名单,而不是男性。
答案 0 :(得分:1)
你可以这样做:
params = {status: 1, color: 'red', user_id: 1}
a = MyModel.where(params)
b = MyModel.where(params.merge(status: 2))
c = MyModel.where(params.merge(status: 3))
或者,要使用一个查询,请执行
requested_status = params.delete(:status)
x = MyModel.where(params).group(:status)
# And then use something like, not sure how hash will look
a = x[requested_status]
b = x['2']
c = x['3']
答案 1 :(得分:1)
如果您使用的是rails 4,则可以使用rewhere而不需要保存范围
filter_1 = MyModel.where({status: 1, color: 'red', user_id: 1})
filter_2 = filter_1.rewhere(status: 2)
filter_3 = filter_1.rewhere(status: 3)