2011-03-09 54 views
11

我試圖將一個大型模型拆分爲多個邏輯組織文件。所以,我有兩個文件:在Ruby on Rails中將一個類拆分爲多個文件

model1.rb

class Model1 < ActiveRecord::Base 
    before_destroy :destroying 
    has_many :things, :dependent=>:destroy 

    def method1 
    ... 
    end 
    def method2 
    ... 
    end 

end 
require 'model1_section1' 

model1_section1.rb

class Model1 
    def method3 
    ... 
    end 
    def self.class_method4 
    ... 
    end 
end 

但是當應用程序加載,並且存在Model1.class_method4一個電話,我得到:

undefined method `class_method4' for #<Class:0x92534d0> 

我也試過這個要求:

require File.join(File.dirname(__FILE__), 'model1_section1') 

我在這裏做錯了什麼?

+4

@Kaleb Brasee是,應該是有幫助嗎?你對(完全製造的)類和方法名稱有反應嗎?或者除了對於偏離主題的諷刺評論之外,還有一個合理的理由嗎? – ilasno 2011-03-09 06:01:10

+1

http://en.wikipedia.org/wiki/Code_smell – 2011-03-09 15:40:16

+3

只是尋找語言語法/結構在這裏幫助,而不是重構或優化,當然不是技術術語下降。 _這不是真正的code_ - 當然它有味道。 – ilasno 2011-03-10 16:42:18

回答

8

我知道我正在回答這個問題,但是我剛剛在我的一個應用程序中完成了這項工作,所以我想發佈我使用的解決方案。

咱們這是我的模型:

class Model1 < ActiveRecord::Base 

    # Stuff you'd like to keep in here 
    before_destroy :destroying 
    has_many :things, :dependent => :destroy 

    def method1 
    end 
    def method2 
    end 

    # Stuff you'd like to extract 
    before_create :to_creation_stuff 
    scope :really_great_ones, #... 

    def method3 
    end 
    def method4 
    end 
end 

你可以將它重構爲:

# app/models/model1.rb 
require 'app/models/model1_mixins/extra_stuff' 
class Model1 < ActiveRecord::Base 

    include Model1Mixins::ExtraStuff 

    # Stuff you'd like to keep in here 
    before_destroy :destroying 
    has_many :things, :dependent => :destroy 

    def method1 
    end 
    def method2 
    end 
end 

和:

# app/models/model1_mixins/extra_stuff.rb 
module Model1Mixins::ExtraStuff 

    extend ActiveSupport::Concern 

    included do 
    before_create :to_creation_stuff 
    scope :really_great_ones, #... 
    end 

    def method3 
    end 
    def method4 
    end 
end 

它完全得益於額外的清潔是ActiveSupport::Concern給您。希望這解決了這個老問題。

+0

我相信模型應該是模塊 – stackOverlord 2012-09-03 20:05:59

+1

這對你的類工作方法嗎?當我在模塊中確定self.method3時,它仍然不適用於我。 – stackOverlord 2012-09-03 23:38:08

+1

@stackOverlord是否讓它與類方法一起工作? – baash05 2013-02-10 23:52:51

1

有一個整潔的寶石叫做modularity,它可以完全符合你的要求。

關於如何正確拆分它們的好指南是gem-session

+0

謝謝,我很欣賞它,但我希望能夠用語言本身做到這一點,沒有寶石或插件。 – ilasno 2011-05-06 22:20:48

1

如果你真的試圖將一個類拆分成兩個文件(類似於C#中的部分類),我不知道使用ruby友好的方法來做到這一點。

然而,一個常見的方法結束與具有相當功能的類(包括大量的方法)是通過Mixins。模塊可以混合到一個類中,並且它們的方法實際上包含在類中。

2

我知道我遲到了,但在試圖解決如何自己做這件事時,我偶然發現了這個問題。

我想答案,爲什麼預期中的示例代碼的類重開不工作是類初始定義爲:

(在model1.rb)

class Model1 < ActiveRecord::Base 

即,第二定義缺乏繼承的類 (在model1_section1.rb)

class Model1 

:然後重新開始作爲。

我用過單獨的。rb文件來分割我的巨大模型,並且他們爲我工作得很好。雖然我承認我用包括和更多的東西是這樣的:

(在workcase.rb)

class Workcase < ActiveRecord::Base 
    include AuthorizationsWorkcase 
    include WorkcaseMakePublic 
    include WorkcasePostActions 

    after_create :set_post_create_attributes 
    # associations, etc 

    # rest of my core model definition 
    end 

(在workcase_make_public.rb)

module WorkcaseMakePublic 
    def alt_url_subject 
     self.subject.gsub(/[^a-zA-Z0-9]/, '_').downcase 
    end 
    # more object definitions 
    end 

    class Workcase < ActiveRecord::Base 
    def self.get_my_stuff 
     do_something_non_instance_related 
    end 
    # more class definitions 
    end 

這讓我結合類和對象方法放入每個包含的.rb文件中。唯一的警告(因爲我沒有使用關注擴展)是因爲在模塊對象方法中對類常量的訪問要求常量使用類名(如Workcase :: SOME_CONST)進行限定,而不是直接允許如果在主文件中調用。總體而言,這種方法似乎只需要最少量的重寫我的代碼就可以把事情變成可管理的代碼塊。

也許這不是真正的'Rails方式',但它似乎在我的特殊場景中很好地工作。

相關問題