2010-04-09 154 views
1

我正在使用一些模型,其中很多給定模型的關鍵屬性實際上都存儲在子模型中。Ruby on Rails:用於子模型的attr_accessor

例子:

class WikiArticle 
    has_many :revisions 
    has_one :current_revision, :class_name => "Revision", :order => "created_at DESC" 
end 
class Revision 
    has_one :wiki_article 
end 

的修訂類有一噸的數據庫字段,並且WikiArticle具有非常少。但是,我經常需要從WikiArticle的上下文中訪問版本的字段。最重要的情況可能是創建文章。我一直在做的是,有很多的方法,看起來像這樣的,每一個領域:

def description 
    if @description 
    @description 
    elsif current_revision 
    current_revision.description 
    else 
    "" 
    end 
end 
def description=(string) 
    @description = string 
end 

,然後我保存,我保存@description到一個新的版本。

這整件事讓我想起了很多attr_accessor,只是它看起來並不像我可以讓attr_accessor做我所需要的。我怎樣才能定義一個attr_submodel_accessor,這樣我就可以給出字段名稱並讓它自動按照attr_accessor的方式創建所有這些方法?

回答

6

術語「子模型」讓我失望,因爲它是非標準術語,但我認爲你要找的是delegate。基本上它可以讓你將某些方法調用委託給對象的屬性或實例方法。

在這種情況下,你會做這樣的事情:

class WikiArticle 
    has_many :revisions 
    has_one :current_revision, :class_name => "Revision", :order => "created_at DESC" 

    delegate :description, :to => :current_revision 
end 

,您可以根據需要儘可能多的方式做到這一點,如:

delegate :description, :title, :author, :to => :current_revision 
+0

感謝這個,我沒有聽說過之前的委託方法。對於讀取此內容的其他人,請注意,委託需要您單獨委派字段的'='方法。不幸的是,委託方法並不是非常通用,足以做我在我的例子中做的事情,其中​​父模型臨時保存子模型的字段,然後在保存上創建它們。順便提一句,子模型的標準術語是什麼? – 2010-04-09 20:59:14