2011-09-21 191 views
1
if condition1 
    ModelName.named_scope1(parameter).named_scope2.named_scope3(parameter).named_scope4 
elsif condition2 
    ModelName.named_scope1(parameter).named_scope2.named_scope3(parameter).named_scope5 
elsif condition3 
    ModelName.named_scope1(parameter).named_scope2.named_scope3(parameter).named_scope6 
elsif 
    ModelName.named_scope1(parameter).named_scope2.named_scope3(parameter).named_scope7 
end 

为了解决上述问题,我写了这样的东西,但它引发了两个查询。我怎样才能让它干?

values = ModelName.named_scope1(parameter).named_scope2.named_scope3(parameter) 

if condition1 
    values.named_scope4 
elsif condition2 
    values.named_scope5 
elsif condition3 
    values.named_scope6 
elsif 
    values.named_scope7 
end 

任何解决方案?

+1

你检查了两个查询的日志吗?范围不应该在查询之前触发查询(除非您使用的是rails 2,而我对此不了解)。 –

回答

6

你的第一个和第二个例子完全一样,所以最初的实现也必须发送两个查询。我认为你的伪代码有点过于一般,不能进一步评论,但通常当我有if..elsif..else条件列表(或长时间情况下)时,我尝试考虑是否可以使用一个查找表(只是一个哈希),而不是。但是,它可能不会直接适用于您的示例。

因此,而不是像这样:

case value 
    when "one" 
    obj.do_something(1, 2, 3) 
    when "two" 
    obj.do_something(4, 5, 6) 
    when "three" 
    ... 
end 

重新思考它:

args_map = { 
    "one" => [1, 2, 3], 
    "two" => [4, 5, 6], 
    "three" => ... 
} 

obj.do_something(*args_map[value]) 
0

可以build dynamic scopes虽然不知道到底你是如何确定范围的选择标准也很难说其中动态范围代码可能属于,或者明显的解决方案(您的)可能更清楚。