2016-04-13 35 views
2

我的Rails應用程序(編譯Rails 3和4)都有自己的數據庫(自然),但也可以訪問第三方數據庫。因此,他們有模型到這個第三方數據庫。我想讓這些模型可以重複使用,而不是將它們複製粘貼到每個應用程序中。沒有控制者,幫手或路線要考慮;只有型號。但由於它具有Rails的「部分」,這似乎表明我需要一個引擎。但是,我希望在所有應用中使用這些模型,這似乎意味着只需要一個「常規」導軌兼容的寶石。「常規」Ruby寶石或Rails引擎?

將它作爲寶石還是Rails引擎會更好嗎?

如果發動機更好,我不太確定從哪裏開始。從我讀過的一些指南看來,您似乎在新的Rails應用程序上創建引擎。我也有點不清楚fullmountable,但我知道我希望這些模型在他們自己的命名空間中。

最後,我希望這些模型可以在我所有的應用程序中使用。發動機可以將打包成寶石,對嗎?如果是這樣,那麼我不能以一個寶石開始,而應該從一個特定的應用程序中作爲引擎開始,然後在事實之後導出寶石?

我很困惑,所以任何反饋意見。我以前從來沒有建造過寶石,也沒有引擎,所以請原諒這方面的愚蠢。

+0

爲什麼除了模型以外沒有其他任何東西表明您需要引擎?無論如何,哪個「更好」取決於,其餘的非常寬泛。從http://edgeguides.rubyonrails.org/engines.html開始並提出非常具體的問題可能有意義嗎? –

+0

@DaveNewton:對不起,我的意思是因爲它有*任何* Rails的「部分」,它似乎(對我來說)它應該是一個引擎。 – istrasci

+0

也許,雖然我不確定那是爲什麼。如果它是一個Gem,你也可以在Rails之外使用它(例如命令行util等),所以我傾向於這樣做。 –

回答

1

引擎實際上並不神奇,雖然很容易獲得這種印象。簡單來說,「引擎」是Rails::Engine的一個子類。只要它被Rails應用程序加載(例如require 'yourgem/engine),引擎中的方法就會執行並將引擎連接到Rails應用程序(包括將引擎內部的一些路徑神奇地附加到應用程序的加載路徑,這是您的引擎模型和控制器如何加載到您的應用程序中)。

現在,如果您嘗試閱讀Getting Started With Rails Engines,您可能認爲除非您使用Rails生成器,並堅持使用Rails約定以及所有這些,否則無法創建引擎。但所有這些都是可選的!我個人建議創建一個普通的寶石,並把它變成一個引擎,主要是通過閱讀API docs,這是更紮實。甚至可以覆蓋你的寶石中擁有app文件夾,保存你的模型和控制器或什麼的建議模式(請參閱API文檔中的Paths部分)。

所以你的情況,你希望你的引擎只包含模型,我建議創業板的佈局,像這樣:

yourgem/ 
    app/ 
    models/ 
     yourgem/ 
     your_thing.rb 
    db/ 
    migrate/ 
     20160413010101_create_models.rb 
    lib/ 
    yourgem/ 
     engine.rb 
     version.rb 
    yourgem.rb 
    yourgem.gemspec 

你engine.rb可以很簡單:

# lib/yourgem/engine.rb 
module YourGem 
    class Engine < ::Rails::Engine 
    isolate_namespace YourGem # this is generally recommended 

    # no other special configuration needed. But maybe you want 
    # an initializer to be added to the app? Easy! 
    initializer 'yourgem.boot_stuff_up' do 
     YourGem.boot_something_up! 
    end 
    end 
end 

你的遷移和模型看起來很正常(儘管記住你的模型必須在你的寶石名稱範圍內,以避免與任何可能使用此引擎的應用程序發生衝突)。

希望有幫助!

+0

嗯,你已經解釋了一些引擎,但我原來的問題仍然沒有得到答覆:哪一種更好的方式來做我需要做的事情?另外(也許你錯過了),我沒有遷移;只有型號。 – istrasci

+0

@istrasci:無論哪種方式,您都需要創建一個寶石。現在,你的模型是ActiveRecord :: Base的子類,還是隻是普通的舊Ruby對象?如果是後者,忘記一切引擎。如果前者,我會建議使用一個引擎來使Rails的依賴顯式化(並允許你鉤入初始化器或生成器)。 –

+0

它們是ActiveRecord :: Base的子類。因此,如果我在我現有的應用程序中創建引擎,那麼我怎樣才能將此引擎「編譯」爲其他應用程序可以使用的gem? – istrasci