2009-08-07 72 views
27

我有一個與幾個模型的應用程序。在哪裏把模型「實用」功能在Ruby on Rails

我有一個功能,我想從幾個模型訪問。

什麼是放置此代碼的最佳位置,以及如何使它可以從需要訪問它的模型訪問?

我的理解是幫手只是爲了觀點。它是否正確?

創建插件並將其放入供應商文件夾看起來是錯誤的 - 這是我的代碼,也是我的應用程序的組成部分。它是否正確?

謝謝。

回答

30

最簡單的辦法是創建lib下一個模塊,並且該混合到需要它,比如車型,在LIB/fooable.rb:

module Fooable 
    def do_foo 
    end 
end 

,然後在各種車型:

class MyModel < ActiveRecord::Base 
    include Fooable 
end 

不需要fooable.rb,只要使用正確的約定命名,Rails自動加載機制就會爲您找到它。

+0

Rails 4:包括沒有爲我工作,但要求。我也必須調用這樣的函數:Fooable.function – reectrix 2014-02-10 15:11:24

+1

@smilingcow這是'rails 3'以來的配置問題。有關詳細信息,請參閱[本](http://stackoverflow.com/a/5273470/535406)回答。 – jibiel 2014-05-30 10:01:55

+3

這樣的事情我把/模型/關注(如果它只是擴展模型),但對於實用程序類,我把它們放在lib/utils(lib可以擁擠) – Aeramor 2014-08-01 18:15:35

2

爲了減少重複的代碼,您還可以創建一個主類,該主類將包含該模塊,並從您想要共享該行爲的每個模型中簡單繼承它。

喜歡的東西:

module Fooable 
    def do_foo 
    end 
end 

class ParentModel < ActiveRecord::Base 
    include Fooable 
end 

class Product < ParentModel end 
class User < ParentModel end 
class Item < ActiveRecord::Base end 

因此,在這個例子中,雙方產品和用戶將分享do_foo功能和項目不會。

+11

這當然是有效的,但我會質疑,消除重複是否值得玷污繼承鏈;你可以爭辯說,這正是模塊幫助避免的:不必要的繼承。是否試圖避免多個包含語句太DRY一步?我想這可能是。 – 2009-08-10 01:47:52

+1

當您的ParentModel在數據庫中有一個名爲「type」的字符串列時,這也會導致問題,因爲這會導致[Single Table Inheritance](http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class -ActiveRecord :: Base-label-Single + table + inheritance)。 – 2014-03-12 20:44:22