Разбирать перед сохранением в MVC

Я начинаю анализировать данные и получать некоторую структуру из строк, предоставленных пользователем (в основном, извлекая цифры и названия городов).

Я запустил небольшой код в интерпретаторе ruby, и теперь я хочу использовать тот же код в веб-приложении.

Я изо всех сил пытаюсь понять, где в коде должен быть мой синтаксический анализ или как он структурирован.

Мой первоначальный инстинкт заключался в том, что это принадлежит модели, потому что это логика данных. Например, есть ли в записи целое число, есть ли в ней два целых числа, есть ли в ней название города и т.д. и т.п.

Однако моя модель должна наследовать и ActiveRecord, и Parslet (для синтаксического анализа), а Ruby, по-видимому, не допускает множественного наследования.

Моя текущая модель выглядит так

#concert model
require 'parslet'
class concert < Parlset::Parser
  attr_accessible :date, :time, :city_id, :band_id, :original_string

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

На самом деле там не так много, но я думаю, что застрял, потому что у меня неправильная структура, и я не знаю, как соединить эти две части.

Я пытаюсь сохранить исходную строку, а также компоненты проанализированных данных.


person pedalpete    schedule 11.07.2011    source источник


Ответы (2)


Я думаю, что вы хотите:

#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
person Chris Barretto    schedule 11.07.2011
comment
Кажется, что-то делает то, что я ищу, хотя я не совсем уверен. Я думаю, это одно из решений и единственный ответ, поэтому я соглашусь с ним. - person pedalpete; 19.07.2011

Мне кажется, что вам нужно несколько парсеров (один для названий городов, один для цифр). Я бы посоветовал вам создать неформальный интерфейс для таких парсеров, например

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

Затем вы должны создать несколько классов Ruby, каждый из которых выполняет задачу синтаксического анализа в ./lib.

Затем в модели вам потребуются все эти рубиновые классы и поместите их в задачу, скажем, в хук before_save или что-то в этом роде.

Как автор parslet, я мог бы добавить, что анализ цифр или названий городов, вероятно, не самое приятное место для parslet. Возможно, вы захотите рассмотреть регулярные выражения там.

person kaspar    schedule 27.09.2011