你好,我一直在尋找一個解決方案。使用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)]
>>
我相信有那麼優雅的解決方案,這一點,例如將子類都回到一個巨大的文件,但我想,如果在避免這種所有可能的。
感謝
是的,這是真的。實際上它是一個常量,因爲該方法實際上獲得了一組格式化的類名,如下所示:def self.inherited(child) super VALID_TYPES << child.name end我會試試你的方法。 – WYSRD 2011-02-02 00:38:48