5

Railsにカスタムフィールドを実装するという現在の計画についてのフィードバックを探しています。私は一般的にレールとアプリ開発に不慣れであり、より経験豊富な個人からのコメントをいただければ幸いです。

バックグラウンド

アプリ:食べ物や飲み物の試飲を追跡します。

私がモデル化しようとしているもの:

  • ユーザーが新しいサンプルタイプを作成します。
  • 彼らはそれを「ワイン」と呼んでいます
  • 彼らは会社を決定し、次の属性を追跡したいと考えています:原産地、ブドウの種類、会社、標高、気温の維持など。
  • 私のデータベースが作成したサンプルタイプに関する唯一の仮定は、データベースに名前があるということです。(例:コーヒー、ワインなど)残りはすべてユーザーが指定したカスタムフィールドです。

これでサンプルタイプが作成されました。

  • ユーザーはサンプルタイプのワインのサンプルの作成を開始します。
  • 彼らはサンプルの作成を選択し、ワインの種類を選択します。
  • 入力する必要のあるフィールドは、前に指定したフィールドです。
  • Originではフランス、Grapeタイプではシャルドネなどを入れました。

-

私のアプローチの計画は次のとおりです。

ユーザーがサンプルタイプを作成するときは、カスタムフィールドを配列または文字列形式で保存し、dataという列の下に保持します。

SampleType
name
wine

データ
[origin, grape_type, company, ...]

ユーザーがWineタイプのサンプルを作成する場合:サンプルタイプのwineを検索します。データ列のキーごとに、フォームフィールドが作成されます。ユーザーがデータを送信すると、すべてのカスタムフィールド名とそれに対応するデータのハッシュが作成されます。私はそれをシリアル化し、次のようなデータ列のハッシュに格納します。

サンプル
タイプの
ワイン

データ
{ origin: "France", grape_type: "Pinot Grigio, ... }

現時点での私の計画は、PostgreSQLのhstoreを使用してデータ列にハッシュを実装することです。

私の質問は次のとおりです。

  1. これは私がやろうとしていることの有効な解決策ですか?
  2. ユーザーが必要なカスタムフィールドを変更すると、問題が発生しますか?
  3. 私が考慮に入れるべき他の懸念はありますか?
  4. このタイプのモデルには、mongodbやその他のそのようなdbの方が適していますか?

私は参照として次のリンクを使用しています: http ://schneems.com/post/19298469372/you-got-nosql-in-my-postgres-using-hstore-in-rails http://blog.artlogic .com / 2012/09/13 / custom-fields-in-rails /

他の多くのスタックオーバーフローの投稿と同様に、しかし、私が上で述べたようにそれを使用している人はいないようです。

コメントをいただければ幸いです。

4

1 に答える 1

2

jtgi、このようなことを思い出したくないほど何度もやったので、最初の反応は「逃げろ!」でした。私の経験では、ユーザー定義フィールド全体は、醜く、ハッキーで悪夢です。すぐに、誰かが「ぶどうで検索できますか?」と尋ねます。または「ブドウに複数の値を入力できるようにしたい。」そして何度も何度も、あなたはこの道を歩むことを永遠に嫌うでしょう. :-)

そうは言っても、あなたのアプローチはかなりまともだと思います。質問に直接答えるには:

  1. はい、これは有効なアプローチです。

  2. はい、ユーザーが必要なカスタム フィールドを変更すると、問題が発生します。(上記を参照)

  3. 以下のメモを参照してください。

  4. そうかもしれません。4番目の質問を読む前にそこに行きました。field => value ハッシュを使用すると、とにかく noSQL ソリューションを実装するようなものになりますが、ルックアップや検索などを実装するのは簡単ではありません。

いくつかの考え:

  • db 関数を使用するのではなく、データを db 列にマーシャリングすると思います。そうすれば、それは純粋な Ruby であり、db 型に依存しません。http://www.ruby-doc.org/core-1.9.3/Marshal.htmlを参照してください。現在、アプリ内のデータをキャッシュするためにこれを行っていますが、かなり滑らかです。文字列よりも複雑なRubyオブジェクトを格納したい場合は、とにかくデータをマーシャリングする必要があるかもしれません。

  • とにかくすぐにそこにたどり着くので、そこにいる間、属性に関するいくつかの「メタデータ」を保存する予定です。たとえば、"grape" は文字列で、最大長は 20、"rating" は 0 から 100 までの整数です。こうすることで、フォームを少しきれいにし、初歩的な検証を行うことができます。

  • この機能が嫌いになったら、私を思い出してください。:-)

于 2013-01-20T19:12:54.227 に答える