在存储在MVC中之前进行解析

时间:2011-07-11 18:03:20

标签: ruby-on-rails parsing rails-activerecord parslet

我开始解析数据并从用户提供的字符串中获取一些结构(主要是提取数字和城市名称)。

我在ruby解释器中运行了一些代码,现在我想在Web应用程序中使用相同的代码。

我正在努力解决代码中我应该解析的位置,或者它是如何构造的。

我最初的直觉是它属于模型,因为它是数据逻辑。例如,条目是否有整数,是否有两个整数,是否有城市名称等等。

但是,我的模型需要继承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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在我看来,好像你需要几个解析器(一个用于城市名称,一个用于数字)。我建议你为这样的解析器创建一个非正式的接口,比如

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

然后你将创建几个Ruby类,每个类在./lib。

中执行解析任务

然后在模型中,你需要所有这些ruby类,并将它们放到任务中,比如在before_save钩子中等等。

作为parslet的作者,我可能会补充说,解析数字或城市名称可能不是解析的最佳位置。可能想在那里考虑正则表达式。