简体   繁体   English

如何使其干燥?

[英]How can I make it DRY?

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  

To solve the above issue I have written it something like this but it fires two queries. 为了解决上述问题,我编写了类似的内容,但是它引发了两个查询。

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  

Any solution ? 有什么办法吗?

Your first and second examples do exactly the same thing, so the original implementation must have also been sending two queries. 您的第一个和第二个示例做的事情完全相同,因此原始实现还必须发送两个查询。 I think your pseudo-code is a little too generic to comment further, but generally when I have lists of if..elsif..else conditions (or long case..when's for that matter), I try to consider if I could use a lookup table (just a Hash) instead. 我认为您的伪代码有点过于笼统,无法进一步注释,但是通常当我有if..elsif..else条件列表(或长情况..when的情况)时,我会尝试考虑是否可以使用而是一个查找表(只是一个哈希)。 It may not directly apply to your example, however. 但是,它可能并不直接适用于您的示例。

So instead of something like this: 因此,而不是像这样:

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

Re-think it as: 重新考虑为:

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

obj.do_something(*args_map[value])

您可以构建动态范围,尽管在不确切知道如何确定范围选择标准的情况下,很难说出动态范围代码可能在哪里 ,或者明显的解决方案(您自己)是否更清楚。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM