2011-11-24 19 views
0

在Rails我有以下結構注入/接入方式

#.../models/A.rb 
module A 
    def m 
    end 
end 

#.../models/a/B.rb 
class A::B < ActiveRecord::Base 
end 

此就自動爲B. 的父母有沒有辦法做這樣的事情家蠶,而無需修改B'我知道我可以做類似B.parent.m的東西,並從那裏創建別名,但那麼我將不得不改變B.
我正在尋找以某種方式將A中的代碼注入到B中,但是我不'不知道這個自動關聯是在幕後完成的。 喜歡的東西

module A 
    module C 
    def mc 
    end 
    end 
    def placed_as_parent (child) # supposing this is the method called to put this module as a parent 
    super child 
    child.include(C) #this is what I would like to do 
    end 
end 

其背後的問題是,我有一個已經被該文件夾的幾款車型之間共享的模塊,我想提出一些共同的東西的模型有沒有需要手動包括在我的每個模型

的/擴展模塊[EDITED]

我不是清楚我的問題。在Rails 3,如果你做

rails generate active_record:model A::B 

它會生成文件

#.../models/A.rb 
module A 
    def self.table_name_prefix 
    'a_' 
    end 
end 

#.../models/a/B.rb 
class A::B < ActiveRecord::Base 
end 

所以,如果我打開控制檯,然後輸入

A::B.table_name # -> 'a_b' 
A::B.table_name_prefix # -> '' 
A::B.parent # -> A 
A.table_name_prefix # 'a_' 

這是自動沒有任何包括/延長在模型B中。我想要的是在A中包含更多內容並從B中訪問它,而不像前面所述的那樣更改B上的任何內容。

+0

感謝您澄清。現在我們知道你想在Ruby語言中是可能的,而這只是一個解決問題的方法。我們可以閱讀ActiveRecord的源代碼。 –

+0

當然,我知道我想要的是可能的!我想要知道怎麼做最好的方法 – Guy

回答

0

說實話,我不確定自己完全理解了你的問題,但無論如何我都會給它一個鏡頭。

Module類中有一個鉤子,它允許您獲取模塊被包含到的類的引用。因此,你可以用它做任何事情。

一個例子:

module A 
    # you can change the class' behavior here 
    def self.included(klass) 
    puts "included in #{klass}" 
    end 
end 

然後使用它:

class B 
    include A #this causes the included hook in the module to be called 
end 

這是你以後在做什麼?

+0

我知道這種方法,但它不是我要找的,因爲我必須在B裏面寫'包含' – Guy

0

的OP寫道:

其背後的問題是,我有一個已經被該文件夾的幾款車型之間共享的模塊,我想提出一些共同的東西爲模特在那裏不必須手動包括/在每個我的模型的擴展模塊

這裏是我會做什麼:

module Stuff1 
    ... 
end 

module Stuff2 
    ... 
end 

module StuffIWantInSeveralModels 
    include Stuff1, Stuff2 
end 

class X < ActiveRecord::Base 
    include StuffIWantInSeveralModels 
end 

class Y < ActiveRecord::Base 
    include StuffIWantInSeveralModels 
end 

那麼您什麼時候想要爲幾個模型添加一個新模塊,您只需在一個位置(在StuffIWantInSeveralModels模塊中)編寫一個「include」語句。

每個模塊應該位於它自己的lib目錄下的文件中,文件名與模塊的名稱相匹配,所以Rails自動加載將會起作用(例如,stuff_i_want_in_several_models.rb)。

這是否實現你想要的?

+0

是的,它實現了我想要的(我在我的應用程序中使用這個),但我正在尋找一種使用軌道的自動模型鏈接來實現它的新方法。 – Guy