[英]Rails+Postgres - hstore automatic conversion of strings
我在一個模型上使用hstore
來存儲帶有浮點值的哈希。 我需要定期訪問並計算存儲中的值。
我當前使用這些值的解決方案是將它們轉換為在我訪問它們時隨處可見的浮點數,這是非常干燥的。 我是否可以通過修改store_accessor方法來自動隱瞞我從商店讀取的所有值以使其成為浮點數?
我知道我可以按照文檔中的描述通過為特定鍵編寫函數來做到這一點,但是我有很多可能的鍵,因此這種方法也不是很干。
我以前沒有使用過hstore
,但是研究了您在問題中提供的文檔。 好吧, hstore
看起來真的很有用(很遺憾,它僅在postgreSQL DB中可用,但肯定學到了新東西)。
通過閱讀文檔,
注意-如果使用的是PostgreSQL特定的列(例如hstore或json),則不需要store提供的序列化。 只需使用store_accessor即可生成訪問器方法。 請注意,這些列使用字符串鍵哈希,並且不允許使用符號進行訪問。
也:
可以使用stored_attributes檢索存儲的屬性名稱。
User.stored_attributes[:settings] # [:color, :homepage]
因此,我們將使用stored_attributes
哈希值在stored_attribute
獲取單獨的字段,並將獲取我們在stored_attribute
上聲明的字段作為數組。 現在,我們需要重寫數組中所有元素的訪問器。 我們可以使用define_method動態覆蓋訪問器。 這就是我想出的。
class WorkingBill < ActiveRecord::Base
store_accessor :prices, :cost_price, :selling_price
stored_attributes[:prices].each do |price_column_name|
define_method("#{key}=") do |value|
super(value.to_f)
end
define_method(key) do
super.to_f
end
end
end
我沒有測試此代碼,因為我現在沒有開發環境。 另外,我懷疑super
調用是否可以在define_method
內部工作。 因此,只需嘗試一下。 獲得開發環境后,我還將對其進行測試。
另外,正如@Vakily所評論的那樣,gem https://github.com/jalkoby/active_store_accessor似乎做得更好,並且還可以處理布爾值,整數字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.