早上好,
我有一个 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 => ,并将数组信息存储为数据库列。这样我就可以尝试整理一个可以检查唯一性的数据库查询,而无需任何 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 - Rails ActiveRecord - 数组属性的唯一性和查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285750/