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

有什么解决办法吗?

最佳答案

您的第一个和第二个示例执行的操作完全相同,因此原始实现也必须发送两个查询。我认为您的伪代码有点太泛型,无法进一步注释,但通常当我有if..elsif..else条件(或长case..when's for the matter)的列表时,我会考虑是否可以使用查找表(只是一个散列)但是,它可能不直接适用于您的示例。
所以不要这样:

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])

关于ruby-on-rails - 如何使其干燥?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7498650/

10-11 05:09