2

データの解析と、ユーザーが指定した文字列からの構造の取得 (主に数字と都市名の抽出) を開始しています。

Ruby インタープリターで少しコードを実行しましたが、今度はその同じコードを Web アプリケーションで使用したいと考えています。

コードのどこで解析を行うべきか、またはどのように構造化されているかについて苦労しています。

私の最初の本能は、それがデータ ロジックであるため、モデルに属しているということでした。たとえば、エントリに整数があるか、2 つの整数があるか、都市名があるかなどです。

ただし、私のモデルは ActiveRecord と Parslet (解析用) の両方を継承する必要があり、Ruby は多重継承を許可していないようです。

私の現在のモデルはこのように見えます

#コンサートモデル
「パースレット」が必要
クラスコンサート < Parlset::Parser
  attr_accessible :date、:time、:city_id、:band_id、:original_string

   rule(:integer) {match('[0-9]').repeat(1)}
   ルート(:整数)
終わり

実際にはそれほど多くはありませんが、構造が間違っていて、これら 2 つの部分を接続する方法がわからないため、行き詰まっていると思います。

元の文字列と解析されたデータのコンポーネントを保存しようとしています。

4

2 に答える 2

1

私には、複数のパーサーが必要であるように見えます(1つは都市名用、もう1つは数字用)。このようなパーサー用に、次のような非公式のインターフェイスを作成することをお勧めします。

class Parser
  def parse(str) # returning result
  end 
end

次に、それぞれが./libで解析タスクを実行するいくつかのRubyクラスを作成します。

次に、モデルでは、これらすべてのrubyクラスが必要であり、それらをタスクに配置します。たとえば、before_saveフックなどを使用します。

パーレットの作成者として、数字や都市名の解析はおそらくパーレットのスイートスポットではないことを付け加えておきます。そこで正規表現を検討したいと思うかもしれません。

于 2011-09-27T13:53:08.983 に答える
1

あなたが望むのは次のとおりだと思います:

#concert model
require 'parslet'
class concert < ActiveRecord::Base
  before_save :parse_fields
  attr_accessible :date, :time, :city_id, :band_id, :original_string


   rule(:integer) {match('[0-9]').repeat(1)}
   root(:integer)

  private
  def parse_fields
    date = Parlset::Parser.method_on_original_string_to_extract_date
    time = Parlset::Parser.method_on_original_string_to_extract_time
    city_id = Parlset::Parser.method_on_original_string_to_extract_city_id
    band_id = Parlset::Parser.method_on_original_string_to_extract_band_id
  end
end
于 2011-07-11T18:33:55.663 に答える