2014-02-17 39 views
0

考慮以下幾點:Rails和Arel的功能:我可以調用對象而不是調用數據庫嗎?

  • budget在其another_collection有很多object秒。
  • obj在其another_collection中有許多與object相同類型的對象。
  • budgetsome_collection已在之前保存在數據庫中並具有主鍵設置的以下循環 之前聲明。
  • some_collectionobj s的集合。

-

some_collection.each do |obj| 
    another_obj = obj.another_collection.build 
    budget.another_collection << another_obj 
end 

budget.another_collection.collect {|another_obj| another_obj.another_obj_id} 
=> [1, 2, 3, 4] 
some_obj_with_pk_1 = some_collection.where(obj_id: obj.id) 
some_obj_with_pl_1.id 
=> 1 
budget.another_collection.where(another_obj_id: some_obj_with_pk_1.id) 
=> [] 

這是不應該發生的。正在發生的事情是,rails會使用another_obj_id = 1在another_collection中查詢數據庫中的任何項目。由於此集合尚未保存到數據庫中,因此這些項目都不會顯示在結果中。

是否有一個函數或東西,我可以傳遞給Arel的where方法,說使用本地結果只有?我知道我可以迭代這些項目並找到它,但如果我不必這樣做,並且只使用一種方法就可以了。

+0

不,您不能,而且這是預期的行爲。您正在構建針對數據庫運行的查詢。除了查詢數據庫並從那裏返回結果之外,爲什麼還會執行其他任何操作? –

+0

我從來沒有說過這是一個錯誤,我在這裏的假設是它**是預期的行爲。我問Arel是否支持我正在做的事情,如果沒有,在rails框架中有沒有一種方法可以完成我所要求的功能。 – DJTripleThreat

+0

你有點早些時候自己回答你的問題。如果您想從未保存的集合中找到內容,則需要根據您的條件迭代和過濾該集合。你不能用Arel查詢它。 –

回答

1

您始終可以使用Enumeable#select,該塊取一個塊並僅返回塊返回true的元素。你要確保你有ActiveRecord首先檢索結果集(通過在你的查詢中調用to_a)。

records = Model.where(some_attribute: value).to_a 
filtered_records = records.select { |record| record.something? } 

根據您的結果集和您的需求,有可能是第二個數據庫查詢速度會更快,因爲你的SQL商店更適合做這些比較比Ruby。但是,如果您的記錄尚未保存,您需要執行類似上述操作,因爲記錄尚未保留。

+0

完美!這是我一直在尋找的,謝謝! – DJTripleThreat

相關問題