2

早上好,

我有一个 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,并且我正在搜索字符串,而不是整数。不过,我确实在此列上有一个索引。

有一个更好的方法吗?我的脑海里闪过几个念头:

  • 计算“权重”数组的 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,这让我现在缺乏可搜索性。

4

1 回答 1

2

我认为在它自己的列中存储一个单独的哈希是有效地做到这一点的唯一方法。您正在使用旨在不易搜索的序列化或键/值存储。

只要确保在散列它们之前考虑对值进行排序,否则你可能拥有相同的内容但不同的散列。

于 2012-04-24T13:13:43.857 回答