2013-07-09 157 views
0

我正在進行移植項目。想要將2.x應用程序遷移到3.x.我遇到活動記錄問題。活動記錄類

在Rails 2.X:

arr=StorageUnit.find(:all, :conditions =>"type='Drawer'") 

上面的代碼將讓我型抽屜中的所有記錄。

arr.class 
=> Array 

在Rails 3.X:

這裏上述功能已被棄用。所以我只好用

arr=StorageUnit.where("type='Drawer'") 

上面的代碼將讓我型抽屜中的所有記錄。

arr.class 
ActiveRecord::Relation 

我想這是因爲活動記錄的變化。 我的問題是我有一些基於這個類的代碼。

對於前:

if arr.class== Array 
    do something 
else 
    do something 
end 

所以當關閉現在我已經改成了

if arr.class== ActiveRecord::Relation 
    do something 
else 
    do something 
end 

只是好奇,想知道是否有任何更好的解決方案或解決任何替代方法。我有很多地方他們使用這些東西。

編輯:

arr=StorageUnit.where("type='Drawer'").all 

將提供類作爲數組。我的目標是知道什麼時候沒有後綴的代碼可以爲您提供所需的記錄,而不是最終所有的用途。只是爲了改班嗎?任何人都可以ecxplain?

+0

明確檢查事物類是不是非常習慣ruby –

+0

@FrederickCheung是正確的。如果你需要絕對檢查類,你可以使用'arr.is_a?(Array)' –

回答

2

StorageUnit.where只是返回ActiveRecord關係。在.all上執行將執行sql並創建StorageUnit的實例。

arr = StorageUnit.where(:type => 'Drawer').all 

它作爲一個關係返回有很多有趣的副作用。除其他事項外,你可以在執行前合併範圍:

StorageUnit.where(:type => 'Drawer').where(:color => 'black') 

您可以查看調試產生的SQL:

StorageUnit.where(:type => 'Drawer').to_sql 

想象一下:

class StorageUnit < ActiveRecord::Base 

    scope :with_drawer, where(:type => 'Drawer') 
    scope :with_color, lambda { |c| where(:color => c) } 

end 

現在:

StorageUnit.with_drawer.with_color('black').first_or_create # return the first storage unit with a black drawer 
StorageUnit.with_drawer.with_color('black').all # return all storage units with black drawers 

re lation允許建立底層查詢,甚至保存以備後用。 all和其他修飾符(如它)對關係具有特殊含義並觸發數據庫執行和建立模型實例。

+0

我知道在這種情況下類將是Array,但我有一個問題。當沒有全部的代碼可以得到所需的記錄時,比指定全部的用法要多。兩者都給出了相同的結果禮儀..?但不同的階級。 –

+1

'with_drawer'不需要是lambda,只是'where(:type =>'Drawer')'沒有lambda包裝將會做; 'with_color'應該是一個類方法,因爲[「使用類方法是接受範圍參數的首選方法」](http://guides.rubyonrails.org/active_record_querying.html#passing-in-arguments)。只是很挑剔:) –

+0

@ mu-is-too-short是正確的。 –