2012-03-06 77 views
2

如何將ActiveRecord對象數組上的過濾器變成範圍如何在Rails中使用基於非查詢的範圍

比如把這個:

Users.all.collect { |u| u.has_super_powers? } 

分爲:

scope :supers, #something here 

的一點是,它可以作爲一個範圍,以便Users.all並不總是 「所有」,如:

Users.undeleted.supers.find_by_this('that') 

我想也許在範圍中使用lambda表達式的方式,但不要認爲這樣做會奏效,因爲我無法訪問記錄,因爲表達式被添加到數據庫查詢中,並且不會作爲結果後的後續步驟運行。

+2

什麼是'has_super_powers?'Scopes只能處理數據庫中的數據,而不是Ruby方法。 – 2012-03-07 00:07:44

回答

3

這取決於您是否可以將u.has_super_powers?轉換爲數據庫查詢。有時它是可能的,有時它不是。

例如:如果您在用戶表中有一個數據庫字段has_super_powers (boolean column)您可以創建一個範圍:

 
scope :has_super_powers, where(:has_super_powers => true) 

現在,您可以與其他示波器一起IT連鎖:

 
User.undeleted.has_super_powers.find_by_this('that')