2011-09-22 59 views
28

我從Rails查找查詢中得到結果集。我想迭代該結果集並根據結果集中的某些條件刪除記錄,然後將其傳遞給進一步處理。額外的標準是在數據庫中保存的數據的外部,因此我不能將它們包括在原始的「查找」查詢中。如何從Activerecord查詢結果集中刪除項目?

注意我不想從數據庫中刪除任何記錄,只是將它們從結果集中刪除。

請有人給我的代碼來做到這一點。

+0

你有沒有找到你要找的東西? – Magnum

+0

這可以關閉爲「太寬泛」或「建議使用非現場資源」。 – halfer

回答

6
set = MyObject.find(...) 
set = set.reject{|s| ... } 

set = set.select{|s| ... } 
+2

當我這樣做'集'似乎被轉換成'數組'? – Deekor

+0

'find'只返回一個對象。也許你想'MyObject.all'或'MyObject.where' –

+0

@DylanVanderBerg你知道這個問題是關於RoR v1還是v2? :) – fl00r

30

使用reject

Model.find_all_by_xxx().reject { |r| r.something? } 
+5

這將不起作用,因爲'find_by_xxx'返回單個記錄。你想要'find_all_by_xxx'。 –

+1

@RyanBigg哎呀,你是對的。我在回答時正在研究一個Doctrine項目,其中'find_by_xxx'返回一個集合。編輯。 – Fabio

1

您可以使用delete_at太:

irb(main):005:0> c = Category.all 
Category Load (0.3ms) SELECT "categories".* FROM "categories" 
=> [#<Category id: 1, name: "15 anos", description: nil, created_at: "2011-09-22 04:52:53", updated_at: "2011-09-22 04:52:53">] 
irb(main):006:0> c.delete_at(0) 
=> #<Category id: 1, name: "15 anos", description: nil, created_at: "2011-09-22 04:52:53", updated_at: "2011-09-22 04:52:53"> 
irb(main):007:0> c 
=> [] 
+4

這將從數據庫中刪除條目,對吧? – JustBasti

0

如果一些處理必須在應用程序代碼,SQL完成能夠 不這樣做,並且結果必須是已更改的查詢對象,通過id重新查詢對象可能是一個(非常非常低效的內存)選項。

needed_ids = Model.where(<some original query>).map{|r| r.something? ? r.id : nil }.compact 
new_collection = Model.where(id: needed_ids)