2011-09-21 194 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雖然不知道到底你是如何確定範圍的選擇標準也很難說其中動態範圍代碼可能屬於,或者明顯的解決方案(您的)可能更清楚。