【问题标题】:Rails ActiveRecord - Uniqueness and Lookup on Array AttributeRails ActiveRecord - 数组属性的唯一性和查找
【发布时间】:2012-05-04 08:55:33
【问题描述】:

早上好,

我有一个 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 =>,并将数组信息存储为数据库列。这样我就可以尝试整理出一个可以检查唯一性的数据库查询,而无需任何 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,这让我现在缺乏可搜索性.

【问题讨论】:

    标签: ruby-on-rails activerecord serialization associations


    【解决方案1】:

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

    请确保在对值进行散列之前考虑对其进行排序,否则您可能拥有相同的内容但不同的散列。

    【讨论】:

    • 感谢乔尔的回答!我担心这会是答案......当你说“在它自己的列中存储一个单独的哈希”时,我认为这就是序列化所做的。您是说将每个哈希属性存储在他们自己的列中吗?连接模型(如上所述)是否适合这些人居住?
    • 我会在与您的键/值存储相同的模型中添加另一列。使用根据您存储在要查询的键/值中的值计算的 MD5 哈希。 Rails 正在对键/值存储做一些“魔术”,我不会计划围绕它,以防将来版本的 Rails 发生一些变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多