2015-12-03 70 views
0

我有很多數據需要從數據庫中查詢。然而傳遞Ruby SQL查看參數

account.records.all.each do |record| 
    record.contacts.all.each do |contact| 
    contact.address.all.each do |address| 
      ..write to file etc 
    end 
    end 
end 

我讀過的SQL視圖將有助於表現,而不是一個。每次(每個查詢記錄),我:Heroku的是超時,當我這樣做,是因爲30秒的限制需要對這組數據做一個where子句。目前,如果我使用「ExportAllRecord」視圖像這樣:ExportAllRecords.where(「ACCOUNT_ID = 3」),它執行以下操作:

ExportAllRecord Load (5.0ms) SELECT "export_all_records".* FROM "export_all_records" WHERE (account_id = 3) 

然而,我真的需要它的「where子句」添加到風景。

我該如何參數化SQL視圖?

我正在使用ActiveRecord。

謝謝。

回答

0

ActiveRecord不關心從正常的數據庫表或數據庫視圖中查詢的位置。

假設你的數據庫視圖被命名爲export_all_records,那麼只需要創建一個新的模式:

# in app/model/export_all_record.rb 
class ExportAllRecord < ActiveRecord::Base 
    default_scope { readonly } 
end 

使用這種模式像一個正常的ActiveRecord模型:

id = 3 # or perhaps params[:id] 
ExportAllRecord.find_by(account_id: id) 
#=> returns all records from the view with the given id 

如果需要,您可以添加多個條件到:

ExportAllRecord. 
    where(account_id: id). 
    where(column1: true, column2: 'foobar') 
    order(:column3) 
+0

我明白,但我不希望整個視圖t o被執行,然後在結果上做一個WHERE。 ExportAllRecord視圖有很多返回的信息。 – Mike

+0

我不確定我們是否使用'view'的相同定義,以及您要執行的*整個視圖的含義。我認爲我們正在討論數據庫中的[實體化視圖](https://en.wikipedia.org/wiki/Materialized_view),它在'SELECT'查詢的上下文中基本上就像普通表一樣。只需使用Rails查詢方法來限定結果。我用一個例子更新了我的答案。 – spickermann

+0

我在數據庫視圖上執行Where子句。將執行視圖上的選擇,然後在結果中使用where account = 3?這個數據庫中有很多數據,如果我們沒有執行where account_id =?在視圖內,我擔心執行需要很長時間。 – Mike