早上好,
我有一个 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,并且我正在搜索字符串,而不是整数。不过,我确实在此列上有一个索引。
有一个更好的方法吗?我的脑海里闪过几个念头:
- 计算“权重”数组的 MD5 哈希,并保存到数据库列。每次我想搜索一个数组时,我仍然需要计算这个哈希值,但我有一种直觉,这会让数据库更容易索引和搜索?
- 努力从 has_and_belongs_to_many 移动到 has_many => through,并将数组信息存储为数据库列。这样我就可以尝试整理出一个可以检查唯一性的数据库查询,而无需任何 YAML 或序列化……</li>
即类似的东西:
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] ]
任何帮助,将不胜感激。请记住,我是个业余爱好者——编程对我来说只是一种爱好!如果我正在做任何非常hacky或遗漏一些明显的事情,请原谅我......
谢谢!
更新 1
我已经对 Rails 3.2“存储”方法进行了一些研究,但这似乎也不是答案……它只是将对象存储为 JSON,这让我现在缺乏可搜索性。