2011-02-01 49 views
0

你好,我一直在尋找一個解決方案。使用Rails 2.3.5Rails:使用類方法返回有關子類的屬性時,爲什麼不會加載子類?

我有一個父類有幾個子類,爲了沒有一個1500行長的文件我有子類保存在app/models目錄的子目錄中。

直到最近,當我看到這個帖子:here

我甚至不能讓子類加載

現在我想用self.inherited類方法 訪問每個孩子的方式像這樣:

class Project < ActiveRecord::Base 

    CHILDREN = [] 
    def self.inherited(child) 
    super 
    CHILDREN << child 
    puts "CHILDREN.inspect: #{CHILDREN.inspect}" 
    end 
    def self.valid_child_types 
    CHILDREN.collect{ |child| child.project_type} 
    end 
end 

暫時,我把一些調試語句,以更好地瞭解如何加載事情。我啓動了控制檯,並注意到了這種行爲:

>> Project 
require_or_load /Users/frankdrebin/Sites/cerp/app/models/project.rb 
loading /Users/frankdrebin/Sites/cerp/app/models/project 
require_or_load /Users/frankdrebin/Sites/cerp/app/models/status.rb 
loading /Users/frankdrebin/Sites/cerp/app/models/status 

=> Project(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer) 
>> Project::CHILDREN 
=> [] 
>> ArticleProject 
require_or_load /Users/frankdrebin/Sites/cerp/app/models/projects/article_project.rb 
loading /Users/frankdrebin/Sites/cerp/app/models/projects/article_project 
CHILDREN.inspect: [ArticleProject(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer)] 
require_or_load /Users/frankdrebin/Sites/cerp/vendor/gems/state_machine- 0.7.3/lib/state_machine.rb 
loading /Users/frankdrebin/Sites/cerp/vendor/gems/state_machine-0.7.3/lib/state_machine 

=> ArticleProject(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer) 
>> Project::CHILDREN 
=> [ArticleProject(id: integer, url: string, deadline: date, state: string, type: string, priority: integer, status_id: integer)] 
>> 

我相信有那麼優雅的解決方案,這一點,例如將子類都回到一個巨大的文件,但我想,如果在避免這種所有可能的。

感謝

回答

1

你有各種各樣的問題:

  1. 孩子在Ruby中的常數,因爲它以大寫字母開頭,你不希望出現這種情況。
  2. 接下來,如果您將其更改爲子級,那麼它將是一個局部變量,但您需要一個實例變量作爲父類定義的實例,因此您需要使用@children。
  3. 您需要在課堂級別設置@children(這可能是您嘗試使用CHILDREN的原因)。

這裏是你會怎麼做:

class Parent 

    @children = [] 

    # Make the attr_reader for the class not an instance of the class 
    class << self 
    attr_reader :children 
    end 

    def self.inherited(child) 
    puts "Parent inherited by child: #{child.inspect}" 
    @children << child 
    super 
    end 
end 

class Child1 < Parent 
end 
puts "Child1 class created" 

class Child2 < Parent 
end 
puts "Child2 class created" 

c1 = Child1.new 
c2 = Child2.new 

puts "Parent.children: #{Parent.children}" 

輸出:

Parent inherited by child: Child1 
Child1 class created 
Parent inherited by child: Child2 
Child2 class created 
Parent.children: [Child1, Child2] 
+0

是的,這是真的。實際上它是一個常量,因爲該方法實際上獲得了一組格式化的類名,如下所示:def self.inherited(child) super VALID_TYPES << child.name end我會試試你的方法。 – WYSRD 2011-02-02 00:38:48

1

也許你需要退後一步,問問自己你真正要完成的,並且是繼承了最好的/唯一途徑?模塊/混入?

+0

不深入瞭解應用程序的細節,是的,我相信繼承是我在這個最好的解決辦法點。在不離主題太遠的情況下,我願意接受任何建議。 – WYSRD 2011-02-01 23:50:09

相關問題