1

繼承mongoid文件:填寫使用鑑於以下車型嵌套屬性

class Company 
    include Mongoid::Document 

    has_many :workers, autosave: true 
    accepts_nested_attributes_for :workers 
    attr_accessible :workers_attributes 
end 

class Worker 
    include Mongoid::Document 
    field :hours 
    attr_accessible :hours 
    belongs_to :company 
end 

class Manager < Worker 
    field :order 
    has_many :contributors, :class_name => "Worker" 
    attr_accessible :order, :contributors 
end 

class Contributor < Worker 
    field :task 
    belongs_to :manager, :class_name => "Worker" 
    attr_accessible :task 
end 

如何創建一個使用嵌套屬性在控制器的公司經理和看法?

這裏是我的猜測:

def new 
    @company = Company.new 
    @company.workers = [Manager.new] 
end 

def create 
    @company = Company.new params[:user] 

    if @company.save 
    redirect_to root_url, :notice => "Company with manager created." 
    else 
    render :new 
    end 
end 

= semantic_form_for @company do |f| 
    = f.semantic_fields_for :workers do |worker_fields| 
    = worker_fields.inputs do 
     = worker_fields.input :hours 
     = worker_fields.input :order 

問題是專門屬於經理後創建不是持久的順序領域。另外,當數據被不正確地填寫有錯誤:

undefined method `order' for #<Worker:0x0000000646f018> (ActionView::Template::Error) 

那麼,有沒有一種方式,嵌套屬性從mongoid模型處理繼承?

該問題與Can nested attributes be used in combination with inheritance?有關,除了使用mongoid的活動記錄外。

說實話,這是我的代碼的解釋......真正的代碼是更復雜的情況,雖然我相信這些都是相關的部分。如果你有更多的問題要問。

UPDATE:

我改變了看法以下:

= semantic_form_for @company do |f| 
    - @company.workers.each do |worker| 
    - if worker._type == "Manager" 
     = f.semantic_fields_for :workers, worker do |worker_fields| 
     = worker_fields.inputs do 
      = worker_fields.input :hours 
      = worker_fields.input :order 

我沒有得到錯誤了,但是嵌套的屬性不正確地更新公司目標。參數如下:

{"company"=> {"workers_attributes"=>{"0"=>{"hours"=>"30", "order" => "fish", "id"=>"4e8aa6851d41c87a63000060"}}}} 

再次編輯簡潔。所以關鍵部分是在「0」=> {data for manager}之間有一個哈希值。工作人員的數據似乎在散列。我希望數據看起來更像如下:

params = { company => { 
    workers_attributes => [ 
     { hours => "30", "order" => "fish" } 
    ]}} 

因爲工人的數據在陣列中,而不是一個哈希舉行這是不同的。是否有另一個步驟讓嵌套屬性正確保存?

謝謝

+0

好的我更接近解決方案。使用fields_for:workers,worker。將更新問題與我的進展 – GTDev

+0

我想我錯了轉彎。我相信問題變成了可以使用單表繼承的模型使用嵌套屬性進行批量填充 – GTDev

回答

1

你使用的是什麼版本的Mongoid?因爲我不認爲refereneces_many的使用會被鼓勵 - 不是說這與你的問題有關,只是想探討你正在使用的版本。在關於華麗的Mongoid.org的文檔中,得到這個,我必須以艱難的方式學習它,他們說要更新你的記錄,你需要將autossave設置爲true。這不準確。你需要它,甚至創造

這樣:

class Company 
    include Mongoid::Document 

    has_many :workers, :autossave => true # your money shot 
    accepts_nested_attributes_for :workers 
    attr_accessible :workers_attributes 
end 

新增:

我重新閱讀你的代碼,我發現這可能是問題如下:您的公司模式設置爲的has_many :工人,並且當變更進入時被設置爲接受工人的嵌套屬性,對嗎?並且在Manager模型中有一個名爲Order的字段,它從Worker中分類。然而,你有一個嵌套字段部分的表單指向Worker而不是Manager,該模型實際上具有Order字段。而這顯然還不夠,因爲公司並沒有多少經理:管理人員,你可能還需要將其設置爲公司模式中的has_many:經理。

+0

已更新至mongoid 2.2.1並且添加了自動保存問題仍然存在。我認爲它與嵌套屬性認爲需要爲工作人員填充屬性時需要填寫管理員屬性的事實有關。我不確定是否有解決方法。 – GTDev

+0

是的,這是問題,但has_many;管理人員不是我想要的一種方法來獲得多態確定類的類型的最佳解決方案。我問的問題是關於http://stackoverflow.com/questions/2553931/can-nested-attributes-be-used-in-combination-with-inheritance與mongoid而不是活動記錄。 – GTDev