[英]Rails4: How to add Computed columns in Active record
我們已經在User表上放置了“ data”列,其中有一個巨大的json轉儲。
現在,每次我們加載一堆用戶時,我們會將所有這些數據都存儲到內存中,從而導致內存不足錯誤。
我們希望能夠編寫一些可在select語句中使用的計算列。
eg:
Instead of doing this
user.data['profile_data']['data']['image']
We would like to add a column :image and then write a query like:
Here :name and :email are actual columns on the table and :image is a computed column:
Users.where(SOME_CONDITION).select(:name,:email,:image)
主要用例是索引頁面,我們在其中顯示所有用戶,這基本上為所有用戶加載數據列
這樣可以避免將巨大的數據列加載到內存中,並幫助我們從數據列加載所需的字段
在Rails4中執行此操作的最佳方法是什么?
更新:
我會將數據列移到另一個表,但是如果不是這樣,請嘗試使用lazy_columns gem。
class User < ActiveRecord::Base
lazy_load :data
end
現在,在初始加載期間, data
列將被排除,但是,如果您嘗試訪問.data
,則會從數據庫中檢索它。
使用migration添加欄:image
。 然后添加以下代碼:
class User < ActiveRecord::Base
before_save :extract_image
private
def extract_image
self.image = self.data['profile_data']['data']['image']
self.save
end
end
before_save
:在Base.save
之前Base.save
(無論是create
還是update
保存)。
Postgresql支持兩種json數據類型 ,如文檔中所述
有兩種JSON數據類型:json和jsonb。 他們接受幾乎相同的值集作為輸入。 實際的主要區別是效率之一。 json數據類型存儲輸入文本的精確副本,處理函數必須在每次執行時重新解析; jsonb數據以分解后的二進制格式存儲,由於增加了轉換開銷,因此輸入速度稍慢,但由於不需要解析,因此處理速度明顯更快。 jsonb還支持索引編制,這可能是一個很大的優勢。
因此,要解決您的問題,您需要通過遷移將data
列的類型更改為jsonb
:
# This should use the up and down methods, because change_column
# is not reversible
class ChangeUsersDataColumnTypeToJsonb < ActiveRecord::Migration
def up
change_column :users, :data, :jsonb
end
def down
change_column :users, :data, :text # or whatever datatype it was
end
end
您可以使用postgres提供的功能來查詢json
數據類型:
Users.where(SOME_CONDITION).select(:name,:email,"data::json->'image' as image")
您訪問image
屬性的方式與其他任何屬性一樣。
您還必須將:data
屬性定義為類似的延遲加載列 ,以便在實例化用戶對象時不會加載該列。
class User < ActiveRecord::Base
lazy_load :data
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.