正在關注問題:
我需要類似空範圍的東西。這意味着這個範圍是靜態的,但是對範圍通常響應的所有方法作出響應。 我目前正在使用一點點骯髒的黑客。我只是提供「1 = 0」作爲條件。我發現這真是醜陋,因爲它碰到了數據庫。簡單地返回一個空數組將不起作用,因爲結果必須響應作用域方法。Ruby on Rails空範圍
有沒有更好的現有解決方案,或者我需要自己編碼?
也許一些示例代碼可能有助於解釋什麼,我需要:你需要User.scoped({})
正在關注問題:
我需要類似空範圍的東西。這意味着這個範圍是靜態的,但是對範圍通常響應的所有方法作出響應。 我目前正在使用一點點骯髒的黑客。我只是提供「1 = 0」作爲條件。我發現這真是醜陋,因爲它碰到了數據庫。簡單地返回一個空數組將不起作用,因爲結果必須響應作用域方法。Ruby on Rails空範圍
有沒有更好的現有解決方案,或者我需要自己編碼?
也許一些示例代碼可能有助於解釋什麼,我需要:你需要User.scoped({})
您正在尋找不存在的事情
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
對不起User.scoped
是不是你想要的。正如評論,這返回一切。應該更加關注這個問題。
我見過where('1 = 0')
之前的建議,Rails也應該緩存它。
而且,where('1 = 0')
在您執行.all
,.each
或其中一種計算方法之前,不會觸及數據庫。
'User.scoped'返回所有用戶,所以它不是一個真正的「空」範圍。我認爲他意味着一個空的範圍,不會返回任何用戶。等同於[]的範圍,但範圍。 – 2012-08-20 09:59:46
User.where(id: nil)
怎麼樣?
或User.where(_id: nil)
for mongoid。
這仍然會觸及數據庫並且不可靠(可能會有一個空id域的記錄,尤其是傳統的非Rails數據庫)。 – PhilT 2012-11-20 20:22:51
看你的示例代碼表明你可能不知道有關SQL彙總查詢,這是Rails中暴露的計算方法:
User.sum(:score)
會給你所有用戶的得分總和
看看在Rails的指南以獲得更多信息:
http://guides.rubyonrails.org/active_record_querying.html#sum
Ehm,不,這個總和只是上面陳述的一個例子 – Baju 2012-11-23 23:33:32
User.where('false')
返回活動Record ::與零元素的關係,這是一個鏈式範圍,除非您真正嘗試訪問其中的一個元素,否則它不會觸及數據庫。這與PhilT的解決方案('1 = 0')相似,但稍微優雅一些。
另一方面,('false')不能和SQLite一起工作,並且'1 = 0'會...... – 2015-03-19 16:12:41
Rails 4引入了none
範圍。
它用於您有一個返回關係的方法的實例,但存在您不希望查詢數據庫的情況。
如果你想有一個範圍,返回一個不變的範圍內使用all
:
將不再以Model.all
呼叫立即執行查詢並返回一個記錄數組。在Rails 4中,撥打Model.all
的電話相當於現在已棄用Model.scoped
。這意味着更多的關係可以鏈接到Model.all
,結果將被懶惰地評估。
爲什麼空集的分數是0以外的任何值?你想在這裏完成什麼? – jdl 2010-09-17 14:09:04
您正在尋找一個空的集合。 – Swanand 2010-09-17 14:20:31
@jdl:它不會是除0之外的其他東西。 – Baju 2010-09-17 14:56:46