2013-04-24 85 views
1

我在使用ember-data將相關記錄保存到Rails後端時遇到問題。將ManyToMany記錄保存到rails後端

型號:

FP.Student = DS.Model.extend 

    firstName: DS.attr('string') 
    lastName:  DS.attr('string') 
    imageUrl:  DS.attr('string') 

    room:   DS.hasMany('FP.Room') 
    parents:  DS.hasMany('FP.Parent') 
    observations: DS.hasMany('FP.Observation') 


FP.Observation = DS.Model.extend 

    name:   DS.attr('string') 
    description: DS.attr('string') 
    observedAt: DS.attr('string') 

    room:   DS.belongsTo('FP.Room') 
    educator:  DS.belongsTo('FP.Educator') 
    students:  DS.hasMany('FP.Student', embedded: true) 

我想從選擇視圖中添加預先存在的學生名單到一個新的觀察。假設學生機型已經在controller.selectedStudents收集我做的:

saveObservation: -> 
    console.log "ObservationsController saveObservation" 
    obs = @get('newObservation') # new observation is created previously 
    obs.set('observedAt', new Date) 
    obs.set('room', @get('room')) 
    obs.set('educator', @get('room.educators').objectAt(0)) 
    selected = @findSelectedStudents() 
    obs.get('students').pushObjects(selected) 
    obs.get('transaction').commit() 

findSelectedStudents: -> 
    @get('selectedStudents').map((id) => 
     @get('students').find((student) -> 
     student.id is id 
    ) 
    ) 

發送回服務器生成的JSON看起來像(這是從服務器日誌):

Started POST "/observations" for 127.0.0.1 at 2013-04-24 21:04:12 +1000 
Processing by ObservationsController#create as JSON 
    Parameters: {"observation"=> 
{"name"=>"DDS", "description"=>"asdsad", "observed_at"=>"Wed Apr 24 2013 21:04:04 GMT+1000 (EST)", "room_id"=>203, "educator_id"=>535, 
"students"=>[{"id"=>605, "first_name"=>"Steven", "last_name"=>"Richards", "image"=>"https://www.filepicker.io/api/file/CTUCsDGwdEVaS"}, 
{"id"=>607, "first_name"=>"Anna", "last_name"=>"Stone", "image"=>"https://www.filepicker.io/api/file/CTUCsDGwdEVaS"}]}} 
Completed 500 Internal Server Error in 5ms 

很抱歉的佈局,但有2名學生,具有完整的屬性列表。服務器拋出的錯誤是ActiveRecord::AssociationTypeMismatch - Student(#70343949384800) expected, got ActiveSupport::HashWithIndifferentAccess(#70343953246680)

現在,我已經有了一個ajax回調函數,它將學生序列化爲一個student_ids數組,其中只包含學生ID。服務器接受該呼叫並建立關聯。但是我更喜歡使用ember-data,並且沒有手動記錄管理的麻煩,我用手動滾動的ajax解決方案找到了。

我試着在Observation上設置一個數組student_ids,但是沒有任何東西被髮送回服務器。

我認爲如果該協會的名稱爲student_attributes,那麼當前的通話可能會有效,但如果學生記錄不髒,則發送所有數據似乎是浪費時間。

所以,我應該試圖重寫序列化程序發回一個student_ids數組?還是我錯過了別的?

感謝,

馬丁

回答

1

要持續一個多服務器上的許多關係,我在黑客串行的hasMany方法在映射添加一個選項serialized

這裏是串行器(CoffeeScript的):

App.Serializer = DS.RESTSerializer.extend 

    # redefine to make it possible to serialize a relationship by an array of ids 
    # to enable it, a 'serialized' property should be set to 'ids' in the adapter mapping 
    # the key in the hash will be the type of the object in the relation ship + _ids' 
    # example : for an hasMany('App.Category'), the key will be category_ids 
    addHasMany: (hash, record, key, relationship) -> 
    type = record.constructor 
    name = relationship.key 

    serializedType = @serializedType type, name 

    if serializedType is 'ids' 
     key = @singularize(@keyForAttributeName(type, name)) + "_ids" 
     manyArray = record.get name 
     serializedIds = [] 
     manyArray.forEach (record) -> 
     serializedIds.push record.get('id') 
     hash[key] = serializedIds 
    else 
     return @_super hash, record, key, relationship 

    # method to access the serialized option in adapter mapping 
    serializedType: (type, name) -> 
    @mappingOption type, name, 'serialized' 

這裏是一個映射配置爲例:

App.Adapter.map App.Product, 
    categories: 
    serialized: 'ids' 

有了這個地方,當時我犯了Product的JSON將包含一個鍵其中包含關聯的類別ID數組。

UPDATE:

正確使用App.Serializer定義,你應該把它添加到應用程序的適配器:

App.Adapter = DS.RESTAdapter.extend 
    serializer: App.Serializer 

而在你的應用程序中使用這個適配器,你必須將其設置在商店:

App.Store = DS.Store.extend 
    adapter: 'App.Adapter' 
+0

我已經添加了您的序列化代碼來存儲。RB及以下我的車型之一: 'FP.Adapter.map FP.observation, 學生: 連載: 'ids'' 然而,當我犯這樣的: 'obs.get(' 學生).pushObjects(選擇) obs.get('transaction')。commit()' 我沒有看到任何對您的序列化程序代碼的調用?應該在提交時調用它,對嗎? – 2013-04-29 00:40:32

+0

是的,如果記錄很髒,應該在提交時調用它,是否正確解決了您的請求?如果沒有,您可能必須手動將記錄標記爲髒,因爲修改*多對多關係不會將該記錄標記爲髒。 – 2013-05-02 08:14:18

+0

請求被觸發,我可以在網絡選項卡中看到它。在發送到服務器的json中,觀察的學生成員是一個空陣列。當我深入瞭解餘燼數據時,我可以通過觀察模型的「關係」看到它。這隻包含'belongsTo'關係,並沒有'hasMany'關係。我想這就是爲什麼'addHasMany'沒有被調用。所以它找到了房間和教育者的數據,並將這些數據添加到json中,但不是學生數據。 – 2013-05-02 13:52:03