2

私が扱っているデータ ソースはひどいものです。整数が期待されるいくつかの場所では、「3」が得られます。電話番号フィールドに、「電話番号は xxx」と表示される場合があります。一部のフィールドは単に空白です。

これは問題ありません。各フィールドを解析しているので、「3」はモデルで整数 3 になり、電話番号 (など) は正規表現によって抽出されます。サービスのユーザーは、データが大ざっぱで不完全であることを認識しています。これは、データ ソースの維持方法に関する残念な事実であり、解析ゲームを強化する以外に何もできることはありません。余談ですが、元のデータをより多く解析するにつれて、独自のバージョンのデータをゆっくりと作成していますが、この貧弱なソースは今のところ行う必要があります。

そのため、ユーザーは解析したいデータを選択し、私たちはできる限りのことを行い、部分的/不正確なモデルを返します。ここで、保存する最終的なモデルを検証する必要があります。null にできない特定のフィールドがあり、特定の文字列はフォーマットに準拠する必要があります。

アプリの流れは次のとおりです。

  1. ユーザーは、解析するデータをサービスに指示します。
  2. サービスは停止してデータを取得し、可能なものを解析して、取得可能なデータを含む部分モデルを返します。
  3. ユーザーにデータを表示し、ユーザーが修正を行い、データが収集されていない必須フィールドに入力できるようにします。
  4. このユーザーが修正したデータは保存されるため、検証されます。
  5. 検証が失敗した場合、ユーザーが修正を行い、すすぎ、繰り返すためにデータを再度表示します。

完全に無効である可能性があるか、データが含まれていない可能性があるが、最終的に検証する必要があるモデルを持つための最良の方法は何ですか? 私が考えた(そして部分的に実装した)2つの方法は次のとおりです。

  1. 2 つのモデル - 検証などがあるデータ モデルと、検証がない UnconfirmedData モデル。元のデータは、ユーザーが修正を行うまで UnconfirmedData モデルに配置されます。修正が完了すると、元のデータはデータ モデルに配置され、検証が試行されます。
  2. Railsの検証ではなく手動で検証が実行される、「確認済みデータ」フラグを持つ1つのモデル。

実際には、私は 2 つのモデルを使用する傾向がありますが、私は Rails にかなり慣れていないので、これを行うためのより良い方法があると思いました.Rails には、そのように私を驚かせる習慣があります :)

4

2 に答える 2

2

1つのモデルを使用するのは簡単です。検証を実行する必要があるかどうかを判断するには、属性/メソッドが必要です。あなたは:if =>それらをバイパス/有効にするために渡すことができます:

validates_presence_of :title, :if => :should_validate

should_validateモデルインスタンスが「暫定的」である場合にfalseを返す単純なブール属性、または必要に応じてより複雑なメソッドにすることができます。

于 2011-01-06T19:01:56.730 に答える
2

リクエスト間でデータを保存する必要がありますか? もしそうなら、私はあなたの 2 つのモデル形式を使用しますが、物事をドライに保つために単一テーブル継承 (STI) を使用します。

解析とレンダリングを担当し、できる限りのことを行う最初のモデルには、保存に関する検証や制限はありません。ただしtype、継承の利点を使用できるように、移行に列が必要です。私が何について話しているのかわからない場合は、STI に関する豊富な情報を読んでください。開始するのに適した場所は、決定的なガイドです。

2 番目のモデルは、アプリケーションの残りの部分で使用する厳密なモデルであり、すべての検証が含まれています。ユーザーが再加工された潜在的に有効なデータを送信するたびに、アプリは params から作成されたオープン モデルのインスタンスを 2 番目のモデルのインスタンスに移動しようとし、それが有効かどうかを確認します。もしそうなら、それをデータベースに保存すると、type属性が変更され、すべてが素晴らしいものになります。有効でない場合は、最初のインスタンスを保存し、2 番目のインスタンスをユーザーに返して、検証エラー メッセージを使用できるようにします。

class ArticleData < ActiveRecord::Base
    def parse_from_url(url)
        # parses some stuff from the data source
    end
end

class Article < ArticleData
     validates_presence_of :title, :body
     validates_length_of :title, :greater_than => 20
     # ...
end

上記のプロセスを容易にするには、かなり激しいコントローラー アクションが必要ですが、それほど難しくはありません。アプリケーションの残りの部分では、モデルに対してクエリを実行して、Article有効なクエリのみを取得するようにしてください。

お役に立てれば!

于 2011-01-06T15:16:10.593 に答える