2013-04-24 39 views
1

我明白你如何使用CLASS_NAME選項在Active Directory中提及的命名空間模式:如何在名稱空間模型中使用多態關聯?

has_one :slide, :class_name => '::Refinery::Slides::Slide' 

以及如何使用多態關聯

has_one :slide, :as => :slideable 

你可以用它們在一起嗎?

has_one :slide, :class_name => '::Refinery::Slides::Slide', :as => :slideable 

如果是這樣,你如何定義多態關聯?

belongs_to :slideable, :polymorphic => true, class_name='::Refinery::Slideables::Slideable' #NO 

我與RefineryCMS工作,每次添加引擎獲取煉油廠:: PluralModel :: SingularModel命名空間。基本上,我希望能夠將幻燈片與案例研究或工作相關聯。這裏是實際的模型。

module Refinery 
    module CaseStudies 
    class CaseStudy < Refinery::Core::BaseModel 
     attr_accessible :title, :description, :position 
     has_one :slide, :class_name => '::Refinery::Slides::Slide', :as => :slideable 
    end 
    end 
end 

module Refinery 
    module Works 
    class Work < Refinery::Core::BaseModel 
     attr_accessible :title, :description, :position, 
     has_one :slide, :class_name => '::Refinery::Slides::Slide', :as => :slideable 
    end 
    end 
end 

module Refinery 
    module Slides 
    class Slide < Refinery::Core::BaseModel 
     attr_accessible :slide_id, :caption, :position, :slideable_id, :slideable 
     belongs_to :slide, :class_name => '::Refinery::Image' 
     belongs_to :slideable, :polymorphic => true 
    end 
    end 
end 

好像我應該可以說slide.slideable.title,但我得到一個錯誤: 未定義的方法'標題」的零:NilClass

apidoc指定inverse_of無法與多態使用,但沒有提及class_name

回答

0

要使多態關聯有效,需要在另一個模型'belongs_to'上添加一個type列和一個id列。類型列將存儲類名稱,所以不需要在通用關聯中指定。

例如,Comment可以屬於QuestionAnswer。讓我們把問題和答案稱爲「可評論的」。評論應該有:commentable_id:commentable_type的列。

class Comment < ActiveRecord::Base 
    # has columns :commentable_id and :commentable_type 
    belongs_to :commentable, :polymorphic => true 
end 

class Question < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

class Answer < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

# example 
comment = Comment.new(:body => "Nice answer!") 
comment.commentable = Answer.find(1) 
comment.save 

所以,你的情況,你可以從WorkCaseStudy刪除:class_name選項,並確保您添加列:slide_type:slideable_type(去與:slideable_id)(與:slide_id去)你Slide。它應該全部「僅僅使用名稱空間類名」。

module Refinery 
    module CaseStudies 
    class CaseStudy < Refinery::Core::BaseModel 
     attr_accessible :title, :description, :position 
     has_one :slide, :as => :slideable 
    end 
    end 
end 

module Refinery 
    module Works 
    class Work < Refinery::Core::BaseModel 
     attr_accessible :title, :description, :position, 
     has_one :slide, :as => :slideable 
    end 
    end 
end 

module Refinery 
    module Slides 
    class Slide < Refinery::Core::BaseModel 
     attr_accessible :slide_id, :caption, :position, :slideable_id, :slideable 
     # add :slide_type and :slideable_type columns 
     belongs_to :slide, :polymorphic => true 
     belongs_to :slideable, :polymorphic => true 
    end 
    end 
end 
+0

謝謝你這麼徹底的回答!我對能夠刪除class_name持懷疑態度,但現在呢 - 會回來並讓你知道。 – tim 2013-04-24 12:41:31

+0

它看起來像你說得對,我可以刪除CLASS_NAME因爲在我的形式我設置slideable_type這樣 slide.radio_button(:slideable_type,煉油廠::作品::工作,:檢查=>(:slideable_type == '作品')) – tim 2013-04-24 13:32:32

相關問題