如何将ActiveRecord`find_each`运行到postgres中的物化视图

时间:2015-03-13 17:26:00

标签: postgresql rails-activerecord materialized-views

因为我从物化视图Matview中提取了数千条记录,所以我想使用find_each将其分解为批量释放内存。

但是,当我运行以下内容时:

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

我得到以下的错误:

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

经过研究,我发现你无法在没有主键的桌子上运行find_each

我尝试使用以下内容向Matview添加唯一ID:

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

编辑:为清楚起见,我在id中没有Matview列。如果我有一个,我听说它可能被活动记录识别为默认主键,但我没有测试过。

1 个答案:

答案 0 :(得分:3)

ActiveRecord并不关心它是否真的是数据库中的主键,但您需要使用primary_key=方法在对象上设置primary_key字段

类似于:

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