2012-09-21 78 views
2

我希望能夠在保存時替換MongoDB對象中的整個嵌入文檔 - HTML表單將包含整個新集。保存在Mongoid中替換嵌入文檔

我還希望它在保存之前驗證所有內容 - 即不要廢棄舊文檔,然後在添加之前驗證每個文檔。

我已經想出了一個實現,但它不是持久的 - 沒有任何新的嵌入式文檔出現。還有一個複雜因素是涉及到繼承。這裏是(簡化),模型的集合我到目前爲止有:

class Person 
    include Mongoid::Document 
    embeds_many :vehicles 
end 

class Vehicle 
    include Mongoid::Document 
    embedded_in :person 
end 

class Car < Vehicle 
end 

class Motorbike < Vehicle 
end 

爲了制定出當用戶提交表單來實例化什麼樣的車,我已經添加了這個方法來Person類:

def build_from_hash(hash) 
    @vehicles= [] 
    hash.each do |idx, vehicle| 
     if vehicle[:_type].constantize < Inclusion # Check for inheritance, for security 
     self.vehicles.push vehicle[:_type].constantize.new(vehicle) 
     end 
    end 
end 

並修改了控制器來調用它:產生

def submit_build 
    @person= current_user.persons.find(params[:id]) 
    @person.build_from_hash(params[:vehicles]) if params.has_key? :vehicles 

    respond_to do |format| 
    if @person.save # Also tried: @person.update_attributes(inclusions: @person.vehicles) 
     format.html { redirect_to @person, notice: 'Person was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: "build" } 
     format.json { render json: @person.errors, status: :unprocessable_entity } 
    end 
    end 
end 

沒有錯誤 - 將頁面重定向如同它的工作,但是當我審視一遍有沒有embdedded文件。

使用Rails 3.2.8,Mongoid 3.0.5,MongoDB 1.8.3。

回答

0

我想通過更標準的Rails風格的方式來做到這一點,儘管有一些特殊行爲的解決方法。

簡短回答:Person類需要accepts_nested_attributes_for :vehicles,我必須從控制器中刪除所有自定義內容,用標準更新操作替換操作。但它不會接受車輛的子類_type參數除非Rails的進程已經實例化的每個子類者的物體,所以我不得不解決它,像這樣的初始化器:

Car.new 
Motorbike.new 

長答案是on the Mongoid Google group