おはようございます、
現在、情報の配列をシリアライズしているRailsモデルがあります。私にとって重要なことは次の 2 つです。
- これが一意であることを確認できるようにしたい (つまり、同じ配列を持つ 2 つのモデルを持つことはできません)
- このハッシュの既存のモデルを検索できるようにしたい (find_or_create_by メソッドのタイプで)。
このモデルは「ポートフォリオ」、つまり株式または債券のグループを表します。配列は、ポートフォリオ内にある証券とそのウェイトの説明です。また、ポートフォリオのグループである 2 番目のモデルもあります (簡単にするために、これを「ポートコレクション」と呼びましょう)。コレクションには多くのポートフォリオがあり、ポートフォリオは多くのコレクションに含めることができます。言い換えると:
class Portfolio
serialize :weights
has_and_belongs_to_many :portcollections
class Portcollection
has_and_belongs_to_many :portfolios
「ポートコレクション」を生成するとき、一連のポートフォリオを構築する必要がありますが、これはプログラムで行います (実装は重要ではありません)。ポートフォリオの構築はコストのかかる作業なので、最初にポートフォリオの存在を確認しようとしています。これは 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 やシリアライゼーションなしで、一意性をチェックできるデータベース クエリを整理することができます…</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] ]
どんな助けでも大歓迎です。私はかなりのアマチュアであることを覚えておいてください - プログラミングは私にとって単なる趣味です! 本当にハックなことをしていたり、明らかな何かが欠けている場合は、すみません....
ありがとう!
更新 1
Rails 3.2 の「store」メソッドについていくつか調査しましたが、それも答えではないようです...オブジェクトを JSON として保存するだけなので、現在と同じ検索可能性の欠如が生じます。