Разбор перед сохранением в MVC - PullRequest
2 голосов
/ 11 июля 2011

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

Я запустил немного кода в интерпретаторе 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

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

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

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

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

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

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

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

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

1 голос
/ 11 июля 2011

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

#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
...