2

おはようございます、

現在、情報の配列をシリアライズしているRailsモデルがあります。私にとって重要なことは次の 2 つです。

  1. これが一意であることを確認できるようにしたい (つまり、同じ配列を持つ 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 として保存するだけなので、現在と同じ検索可能性の欠如が生じます。

4

1 に答える 1

2

これを効率的に行う唯一の方法は、独自の列に別のハッシュを格納することだと思います。簡単に検索できないように設計されたシリアル化またはキー/値ストアを使用しています。

値をハッシュする前に、値を並べ替えることを検討してください。そうしないと、同じコンテンツでもハッシュが異なる可能性があります。

于 2012-04-24T13:13:43.857 に答える