克隆当前范围

时间:2015-02-15 12:28:50

标签: ruby-on-rails activerecord scope

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,所以我最终得到的是女性名单,而不是男性。

2 个答案:

答案 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)