2012-04-23 36 views
2

早上好,軌道ActiveRecord - 唯一性和查找陣列屬性

我有一個Rails模型,我正在序列化一個信息數組。有兩件事情是很重要的對我說:

  1. 我希望能夠保證,這是唯一的(即不能有兩個型號,同一陣列)
  2. 我希望能夠搜索現有模型這個散列(在一種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,這使我現在同樣缺乏可搜索性。

回答

2

我認爲在它自己的列中存儲一個單獨的散列是有效完成此操作的唯一方法。您正在使用序列化或設計爲不易搜索的鍵/值存儲。

只要確保在散列它們之前考慮對值進行排序,其他方面您可以擁有相同的內容但散列不同。

+0

感謝您的回答喬爾!我擔心這將是答案......當你說「在自己的專欄中存儲單獨的散列」時,我認爲這是序列化所做的。你的意思是把散列屬性EACH存儲在他們自己的專欄中嗎?連接模型(如上所述)是否適合這些人居住? – Brandon 2012-04-24 20:51:54

+1

我會在與您的鍵/值存儲相同的模型中添加另一列。使用根據存儲在鍵/值中的值查詢的MD5哈希來查詢。 Rails正在用關鍵/值存儲做一些「魔術」,如果未來版本的rails有一些變化,我不會計劃它。 – 2012-04-25 08:58:13