2015-03-13 51 views
2

由於我從物化視圖Matview中拉取了數千條記錄,我想用find_each將其分解成批以釋放內存。如何運行ActiveRecord`find_each`到postgres中的物化視圖

然而,當我運行以下命令:

Matview.where('p_id > 100').find_each {|m| m } 

我得到以下eror:

PG::SyntaxError: ERROR: zero-length delimited identifier at or near """" 

經研究,我發現,你不能沒有主鍵的表運行find_each

我嘗試使用添加一個唯一的ID Matview

CREATE UNIQUE INDEX index_mv ON matview(p_id)

而成功,這並不能代替主鍵。

我試着用下面的添加主要約束我的物化視圖:

ALTER MATERIALIZED matview ADD CONSTRAINT mv_pk primary key (p_id) disabled

但是失敗了。

所以一般來說,我的問題是,如何在物化視圖上運行find_each,或者具體地說,我如何將主鍵添加到物化視圖以便我可以運行find_each

編輯:爲清楚起見,我不Matviewid列。如果我有一個,我聽說它可能被活動記錄識別爲默認主鍵,但我沒有測試過。

回答

2

ActiveRecord並不關心它是否真的是數據庫中的主鍵,但是您需要使用primary_key=方法在對象上設置primary_key字段。

因此,像:

class Matview < ActiveRecord::Base 
    self.table_name = 'MATERIALIZED_VIEW_NAME_HERE' 
    self.primary_key = 'ID_COLUMN_NAME_HERE' 
end 
+0

哇這麼簡單。謝謝! – allenwlee 2015-03-13 17:50:51