簡體   English   中英

Rails4:如何在活動記錄中添加計算列

[英]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中執行此操作的最佳方法是什么?

更新:

  • 我們在Heroku上使用postgres。

我會將數據列移到另一個表,但是如果不是這樣,請嘗試使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM