0

同事!我有文檔模型。文檔應該由其中一個解析器處理(在我的項目中它們被稱爲「導入器」並存儲在'lib/importers'文件夾中)。問題是關於在模型層中實現實體Importer的最佳方式是什麼? (例如,關聯文件與進口商)。存儲模型內的.rb文件列表

  1. 第一個想法是創建進口商表,但後來我將有2個獨立的地方進口商名稱將被保存(數據庫和文件系統)。壞的情況:

案例1:進口商:我已經交鋒了新的進口商,卻忘了將它添加到進口表=我不能文檔與此impoter

案例2關聯更名和我們忘了將其重命名內部數據庫=錯誤

  • 我決定限定

    def Document.importers @importers ||= Dir.entries("#{Rails.root}/lib/importers/") .select { |name| !File.directory?(name) && name != 'base_importer.rb'} .map { |name| name.gsub(/\.rb$/, '') } end

  • 用於f.association inout並將導入器字符串屬性添加到文檔模型。所以我可以通過以下方式獲得進口商類 - 「importer.classify.constantize」。它的工作原理,但它看起來令人毛骨悚然

    你能爲這種情況提供更好的解決方案嗎?我會欣賞聽到任何想法;)

    回答

    0

    溶劑化在我的本地紅寶石聊天頭腦風暴期間作了發言:

    我沒有提到的所有進口商都從中也被放置在LIB /進口商的base_importer繼承。我們決定向它添加'inheritors'數組,並使用由ruby核提供的鉤子'inherited'存儲所有的繼承者 - >http://ruby-doc.org/core-2.2.0/Class.html#method-i-inherited

    class BaseImporter 
        @inheritors = [] 
    
        def self.inheritors 
        @inheritors 
        end 
    
        def self.inherited(subclass) 
        @inheritors << subclass.name 
        end 
        # ... 
    end 
    

    我們預計它工作得很好,但是我們忘了,所有的類都渴望加載Rails中。因此BaseImporter.inheritors將在全新的系統啓動時向您返回[]。:

    [email protected]:~/Projects/project$ rails c 
    Running via Spring preloader in process 16832 
    Loading development environment (Rails 4.2.5) 
    B2.2.3 :001 > BaseImporter.inheritors 
    => [] 
    

    要強制所有進口商的裝載我做了一個初始化:

    # config/initializers/importers.rb 
    # Preload importers 
    require 'base_importer' 
    Dir.glob("#{Rails.root}/lib/importers/*.rb").each { |file| require file } 
    

    BaseImporter應該首先被加載,因爲如果任何進口商將BaseImporter之前加載它不會火「繼承」掛鉤:

    [email protected]:~/Projects/project$ rails c 
    Running via Spring preloader in process 16846 
    Loading development environment (Rails 4.2.5) 
    2.2.3 :001 > require "xxx_importer" 
    => true 
    2.2.3 :002 > require "base_importer" 
    => true 
    2.2.3 :003 > require "yyy_importer" 
    => true 
    2.2.3 :004 > BaseImporter.inheritors 
    => ["XxxImporter"] 
    

    隨意張貼在該解決方案的反饋。我會很高興聽到它

    0

    我會在數據庫中建模他們,然後有一些系統來更新數據庫,如果文件更改。這一直髮生在資產管理系統:你有一些物理文件和一些數據,是的,如果他們不同步,你有問題。所以,你把系統放在適當的位置,試圖讓它們保持同步。例如,你可以有一個rake任務來根據物理文件更新數據庫,然後協議是你需要在更改文件後運行rake任務,如果你沒有,那麼你搞砸了,問題是你的故障。開發人員應該能夠在這些規則中工作。

    最終,Rails是關於對象關係數據的,所以如果你想使用rails的話就適用。如果您嘗試根據文件夾的內容每次都嘗試建立一個實例負載的某個路徑,那麼您最終會遇到一個非常複雜且效率低下的系統。

    +0

    感謝您的迴應Max!我不認爲耙子任務是最好的解決方案,因爲我確信我需要使用某種自動方式。也許,你的意思是某種自動化,每次導入程序發生變化就會掛起rake任務,但是當特定目錄中的文件發生更改時,我不知道如何掛接任何類型的腳本。我會在這裏發佈我的本地ruby聊天解決方案。如果您發現任何微弱的時刻,請隨時批評它 – AntonTkachov