我在使用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數組?還是我錯過了別的?
感謝,
馬丁
我已經添加了您的序列化代碼來存儲。RB及以下我的車型之一: 'FP.Adapter.map FP.observation, 學生: 連載: 'ids'' 然而,當我犯這樣的: 'obs.get(' 學生).pushObjects(選擇) obs.get('transaction')。commit()' 我沒有看到任何對您的序列化程序代碼的調用?應該在提交時調用它,對嗎? – 2013-04-29 00:40:32
是的,如果記錄很髒,應該在提交時調用它,是否正確解決了您的請求?如果沒有,您可能必須手動將記錄標記爲髒,因爲修改*多對多關係不會將該記錄標記爲髒。 – 2013-05-02 08:14:18
請求被觸發,我可以在網絡選項卡中看到它。在發送到服務器的json中,觀察的學生成員是一個空陣列。當我深入瞭解餘燼數據時,我可以通過觀察模型的「關係」看到它。這隻包含'belongsTo'關係,並沒有'hasMany'關係。我想這就是爲什麼'addHasMany'沒有被調用。所以它找到了房間和教育者的數據,並將這些數據添加到json中,但不是學生數據。 – 2013-05-02 13:52:03