2010-09-17 90 views
16

正在關注問題:
我需要類似空範圍的東西。這意味着這個範圍是靜態的,但是對範圍通常響應的所有方法作出響應。 我目前正在使用一點點骯髒的黑客。我只是提供「1 = 0」作爲條件。我發現這真是醜陋,因爲它碰到了數據庫。簡單地返回一個空數組將不起作用,因爲結果必須響應作用域方法。Ruby on Rails空範圍

有沒有更好的現有解決方案,或者我需要自己編碼?

也許一些示例代碼可能有助於解釋什麼,我需要:你需要User.scoped({})

+0

爲什麼空集的分數是0以外的任何值?你想在這裏完成什麼? – jdl 2010-09-17 14:09:04

+1

您正在尋找一個空的集合。 – Swanand 2010-09-17 14:20:31

+0

@jdl:它不會是除0之外的其他東西。 – Baju 2010-09-17 14:56:46

回答

0

您正在尋找不存在的事情


class User < ActiveRecord::Base 
    named_scope :admins, :conditions => {:admin => true } 
    named_scope :none_dirty, :conditions => "1=0" # this scope is always empty 

    def none_broken 
    [] 
    end 

    def self.sum_score # okay, a bit simple, but a method like this should work! 
    total = 0 
    self.all.each do |user| 
     total += user.score 
    end 
    return total 
    end 
end 
User.admin.sum_score # the score i want to know 
User.none_drity.sum_score # works, but hits the db 
User.none_broken.sum_score # ...error, since it doesn't respond to sum_score 
0

我的事情。你可以通過修改find方法來實現這樣的事情。然而,這將是一個矯枉過正的問題,所以我建議保持這一點,除非它對性能至關重要。

+0

不會'User.scoped({})'等同於'User.all'嗎? – Swanand 2010-09-17 14:24:36

+0

它不是絕對等價的,但它不工作。 – Baju 2010-09-17 14:45:28

+0

@Swanand:它們不等價,'scoped'返回一個懶惰的'ActiveRecord :: NamedScope :: Scope',而'User.all'返回一個數組。 – tokland 2012-10-03 09:56:37

2

對不起User.scoped是不是你想要的。正如評論,這返回一切。應該更加關注這個問題。

我見過where('1 = 0')之前的建議,Rails也應該緩存它。

而且,where('1 = 0')在您執行.all,.each或其中一種計算方法之前,不會觸及數據庫。

+1

'User.scoped'返回所有用戶,所以它不是一個真正的「空」範圍。我認爲他意味着一個空的範圍,不會返回任何用戶。等同於[]的範圍,但範圍。 – 2012-08-20 09:59:46

0

User.where(id: nil)怎麼樣?

User.where(_id: nil) for mongoid。

+0

這仍然會觸及數據庫並且不可靠(可能會有一個空id域的記錄,尤其是傳統的非Rails數據庫)。 – PhilT 2012-11-20 20:22:51

-1

看你的示例代碼表明你可能不知道有關SQL彙總查詢,這是Rails中暴露的計算方法:

User.sum(:score)會給你所有用戶的得分總和

看看在Rails的指南以獲得更多信息:

http://guides.rubyonrails.org/active_record_querying.html#sum

+0

Ehm,不,這個總和只是上面陳述的一個例子 – Baju 2012-11-23 23:33:32

11
User.where('false') 

返回活動Record ::與零元素的關係,這是一個鏈式範圍,除非您真正嘗試訪問其中的一個元素,否則它不會觸及數據庫。這與PhilT的解決方案('1 = 0')相似,但稍微優雅一些​​。

+0

另一方面,('false')不能和SQLite一起工作,並且'1 = 0'會...... – 2015-03-19 16:12:41

18

Rails 4引入了none範圍。

它用於您有一個返回關係的方法的實例,但存在您不希望查詢數據庫的情況。

如果你想有一個範圍,返回一個不變的範圍內使用all

將不再以Model.all呼叫立即執行查詢並返回一個記錄數組。在Rails 4中,撥打Model.all的電話相當於現在已棄用Model.scoped。這意味着更多的關係可以鏈接到Model.all,結果將被懶惰地評估。