早上好,軌道ActiveRecord - 唯一性和查找陣列屬性
我有一個Rails模型,我正在序列化一個信息數組。有兩件事情是很重要的對我說:
- 我希望能夠保證,這是唯一的(即不能有兩個型號,同一陣列)
- 我希望能夠搜索現有模型這個散列(在一種find_or_create_by方法中)。
該模型描述了「投資組合」 - 即一組股票或債券。該數組描述了投資組合內的證券以及權重。我還有第二種模式,這是一組投資組合(讓我們稱之爲「Portcollection」來簡化事情)。一個集合有許多投資組合,一個投資組合可以在許多集合中。換句話說:
class Portfolio
serialize :weights
has_and_belongs_to_many :portcollections
class Portcollection
has_and_belongs_to_many :portfolios
當我產生一個「portcollection」我需要建立一個一羣的投資組合,這是我做的編程方式(實現並不重要)。建立一個投資組合是一個昂貴的操作,所以我試圖首先檢查一個存在。我想我可以通過find_or_create_by來做到這一點,但沒有多少運氣。這是我目前的解決方案:
Class Portcollection
before_save :build_portfolios
def build_portfolios
……
proposed_weights = ……
yml =proposed_weights.to_yaml
if port = Portfolio.find_by_weights(yml)
self.portfolios << port
else
self.portfolios << Portfolio.create!(:weights => proposed_weights)
end
……..
end
這是行得通的,但它很慢。我有一種感覺,這是因爲當我嘗試檢查現有投資組合(這可能運行數百萬次)時,我會在每次運行YAML時將其轉換爲YAML,並且我正在搜索字符串,而不是整數。不過,我確實在這個專欄有索引。
有沒有更好的方法來做到這一點?我想到了一些想法:
- 計算「權重」數組的MD5哈希,並保存到數據庫列。每次我想要搜索一個數組時,我仍然必須計算這個散列值,但是我有一種直覺,這會讓數據庫索引&搜索更容易一些?
- 正在從has_and_belongs_to_many移動到has_many => through,並將數組信息存儲爲數據庫列。這樣我可以嘗試理清數據庫查詢,可以檢查是否有獨特性,沒有任何YAML或序列號...
即是這樣的:
class Portfolio
has_many :portcollections, :through => security_weights
class Portcollections
has_many :portfolios, :through => security_weights
SECURITY_WEIGHTS
id portfolio_id portcollection_id weight_of_GOOG weight_of_APPLE ……
1 14 15 0.4 0.3
在情況下,重要的是,「權重「陣列看起來像這樣:
[ [‘GOOG’, 0.4] , [‘AAPL’, 0.3] , [‘GE’, 0.3] ]
任何幫助,將不勝感激。請記住我是一個業餘愛好者 - 編程對我來說只是一種愛好!請原諒我,如果我做任何真正哈希或缺少明顯的東西....
謝謝!
更新1
我做了一些研究,Rails的3.2「存儲」的方法,但似乎並沒有得到答案要麼...它只是將對象存儲爲JSON,這使我現在同樣缺乏可搜索性。
感謝您的回答喬爾!我擔心這將是答案......當你說「在自己的專欄中存儲單獨的散列」時,我認爲這是序列化所做的。你的意思是把散列屬性EACH存儲在他們自己的專欄中嗎?連接模型(如上所述)是否適合這些人居住? – Brandon 2012-04-24 20:51:54
我會在與您的鍵/值存儲相同的模型中添加另一列。使用根據存儲在鍵/值中的值查詢的MD5哈希來查詢。 Rails正在用關鍵/值存儲做一些「魔術」,如果未來版本的rails有一些變化,我不會計劃它。 – 2012-04-25 08:58:13