簡體   English   中英

現有 Rails model 未從數據庫中獲取

[英]Existing Rails model without fetching it from the database

有誰知道是否可以創建一個 model 實例並應用 ID 和任何其他屬性而無需從數據庫加載它? 我試過這樣做,但沒有從數據庫中獲取關聯:(有什么想法嗎?


編輯

我想要完成的只是這樣:

  1. 從數據庫中獲取現有記錄。
  2. 將記錄的“散列”output 存儲到 redis 或其他一些 memory 存儲中。
  3. 下次獲取該記錄時,首先獲取緩存的存儲,如果未找到,則轉到步驟 1。
  4. 如果有緩存命中,則將所有緩存的屬性加載到 model 中,並使 model 實例表現得好像它是從數據庫中提取的有限列集的 model 一樣。

這就是我卡住的地方,我一直在做的是創建一個 Model.new object 並手動設置每個參數。 這可行,但它將實例化的 model object 視為新記錄。 ActiveRecord 中必須有一個中間子程序來進行屬性設置。

我通過執行以下操作解決了這個問題。

  1. Create a new model class which extends the model class that I want to have cached into memory.

  2. 將新 class 的 table_name 設置為與父 class 相同的名稱。

  3. 創建一個新的初始化方法,在其中調用超級方法,然后允許該方法的參數允許包含父 class 的所有屬性的 hash 變量。

  4. 重載方法new_record? 並將其設置為false以便關聯工作。

這是我的代碼:

class Session < User

  self.table_name = 'users'

  METHODS = [:id, :username] # all the columns that you wish to have in the memory hash
  METHODS.each do |method|
    attr_accessor method
  end

  def initialize(data)
    super({})

    if data.is_a?(User)
      user = data
      data = {}
      METHODS.each do |key|
        data[key] = user.send(key)
      end
    else
      data = JSON.parse(data)
    end

    data.each do |key,value|
      key = key.to_s
      self.send(key+'=',value)
    end
  end

  def new_record?
    false
  end

end

memcached gem 將允許您將任意 Ruby 對象推入其中。 如果您正在使用它,這一切都應該透明地為您處理。

否則,看看 ActiveRecord::Base#instantiate 看看它是如何正常完成的。 您將不得不通過一堆 Rails 堆棧進行跟蹤,但這就是您嘗試這種駭客所得到的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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