我怎么能让它变干?

时间:2011-09-21 11:03:38

标签: ruby-on-rails ruby

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  

任何解决方案?

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:0)

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