2011-07-11 34 views
2

我開始解析數據並從用戶提供的字符串(主要是拉出數字和城市名稱)獲取一些結構。解析之前存儲在MVC

我已經跑了一下在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 

確實不多,但我覺得我堅持,因爲我已經得到了結構錯了,不知道如何將這兩個片段連接起來。

我試圖存儲原始字符串,以及解析數據的組件。

回答

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 
+0

似乎有點做我在找什麼,雖然我不完全確定。我想這是一個解決方案,也是唯一的迴應,所以我會用它。 – pedalpete

1

在我看來,就好像你需要幾個解析器(一個城市的名字,一個是數字)。我建議你創建一個這樣的解析器的非正式的接口,如

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

,那麼你會創建多個Ruby類,每個在./lib做一個分析任務。

然後在模型中,你需要所有這些Ruby類,並把他們的任務,讓在before_save鉤或這樣說。

由於parslet的作者,我想補充一點解析數字或城市名稱可能不是甜蜜點parslet。可能想在那裏考慮正則表達式。