2013-04-04 213 views
1

我想從一個嵌套的窗體構建一個多態關係,這個窗體向後是我找到的所有示例。我希望有人指出我的方式的錯誤。Rails 3多態嵌套屬性

class Container < ActiveRecord::Base 
     belongs_to :content, :polymorphic => true 
end 
class Notice < ActiveRecord::Base 
     has_one :container, :as => :content 
end 
class Form < ActiveRecord::Base 
     has_one :container, :as => :content 
end 

似乎大多數人會從通知或表格建立一個集裝箱,但在我的情況下,通知或表格包含的內容(文件位置或幾個數據庫字段)少量所以它是多幹呃從容器中建立通知或表格。

我想我可以通過添加accepts_nested_attributes_for :content解決,但是這給了我一個unrecognized attribute :notice當我嘗試創建一個嵌套的通知集裝箱(尋找內容,而不是多態關聯)

我可以手動和明確的做排除像

if params[:container].has_key('notice') 
    @c = Container.new(params[:container].except(:notice)) 

嵌套的領域,然後建立,但是,這不是一個味道?有沒有更好的辦法?

謝謝您的閱讀!

回答

0

嵌套屬性被設計用於從父到孩子,而不是其他方式。此外,在這種情況下,嵌套屬性如何知道您是否嘗試創建NoticeForm對象?

如果您發現機建立從容器中的內容,你可能有你的協會內而外 - 試着改變你的架構:

class Container < ActiveRecord::Base 
    has_one :notice 
    has_one :form 
end 

class Notice < ActiveRecord::Base 
    belongs_to :container 
end 

class Form < ActiveRecord::Base 
    belongs_to :container 
end 

您可以使用驗證,以確保只有一個孩子(:notice:form)實際上是相關的,如果需要的話。

+0

嗯。我以爲它會通過simple_fields_for鍵知道要創建什麼對象的方式與我所做的相同。如果我做了你提到的has_one,我就失去了執行Container.find(1).content.get_data的能力,其中get_data已在Notice和Form中定義。 – Questor 2013-04-04 21:22:52

+0

然後你可以改變它來使用STI,並且從一個抽象的Content類繼承Notice和Form。或者,您可以在Container模型中創建幫助程序方法和/或緩存以查找內容。 – PinnyM 2013-04-05 02:56:25

+0

+1爲abstract_class。我與STI一起去了,但會查看.abstract_class = true來刪除重複的字段。謝謝! – Questor 2013-04-09 00:43:38