2014-01-21 83 views
0

我有兩個型號:更新HAS_ONE相關模型

Student > belongs_to Locker 
Locker > has_one Student 

與此相關聯,我不得不去更衣室,併爲其分配一個學生,或者如果我會轉身的關聯,我可以去的學生,給他分配一個儲物櫃。

這是什麼工作,我理解。 但是,目前我有像上面描述的設置。

當然,現在有了一個想法,那就是直接爲我正在創建的學生(新生)直接分配一個儲物櫃將會非常酷。

所以在這種情況下,我確實有儲物櫃,但學生目前不在場,而且當它被創建時,也應該創建從儲物櫃到這個學生的聯繫。 因此,實際上會創建一個ID爲XXX的新學生,但同時該ID也應該轉到一個儲物櫃及其student_id屬性。

我敲我的腦袋如何處理這一點,因爲我想通了這些選項並不真正做的工作(我使用simple_form BTW): - 利用協會 - accepts_nested_attributes

唯一的辦法我看到它以某種方式發送虛假身份證(attr_accesor)選定的鎖櫃ID到學生模型,創建學生,寫下它的ID,找到更衣室,更新儲物櫃與這個新的ID。

但它感覺很奇怪和錯誤。

難道有人指着我正確的方向嗎?

回答

1

如果您的關聯配置正確,那麼您的學生表中有一個:locker_id,因此您只需在新學生表單上有一個選擇框。

<% form_for @student do |form| %> 
    <%= form.input :name %> # etc... 
    <%= form.collection_select(:locker_id, @unassigned_lockers, :id, :name) %> 
    <%= form.submit %> 
<% end %> 

這是一個非常簡單和標準的情況下,除非有什麼你不告訴我們。

請注意,我拋出了@unassigned_lockers對象而不是做Locker.all,因爲您希望這裏有一些邏輯,只顯示下拉列表中未分配的儲物櫃,我假設。

由於您尚未按照原來描述的方式設置關係,因此無法手動處理,無法向學生提交:locker_id。作爲一個快速的建議:

<% form_for @student do |form| %> 
    <%= form.input :name %> # etc... 
    <%= collection_select_tag(:locker_id, @unassigned_lockers, :id, :name) %> 
    <%= form.submit %> 
<% end %> 

選擇標籤現在將在PARAMS分開來實現它,你將需要改變你的create方法找到更衣室和更新其學生證:

def create 
    @student = Student.new(params[:student]) 
    if @student.save 
    Locker.find(params[:locker_id]).update_attribute(:student, @student) 
    end 
end 

這當然需要一些錯誤捕捉和改進,但應該啓動你。

+0

這正是我採取的方式 - 但我結束了太多的IF和案例。看起來很複雜,我覺得沒有效果。 在新文章中額外評論。 –

+0

梅,不能編輯評論了。 我們不僅在談論創建一個新學生/附加現有的儲物櫃。但也更新學生/儲物櫃。由於需要考慮一些組合,這會帶來更多的複雜性。它變得越來越複雜。我正在調查nested_attributes,但得出的結論是,我真的很想達到目標。 –

+0

這個答案中的代碼也可以很好地編輯學生...只需按照標準更新程序,並在學生保存後包含更衣室邏輯。如果'params [:locker_id]'不等於學生當前的儲物櫃ID,請確保您取消分配他們當前的儲物櫃。 – Matt

0

沒試過您的解決方案,但你沒有立刻提醒after_create,after_update的:

學生:

after_create :update_locker 
after_update :update_locker 

private 

    def update_locker 
    Locker.update(self.locker_id, :student_id => self.id) 
    end 

我有帶鎖的驗證問題了,當然,由於只有一個學生可以有更衣室,而不是更多。目前,如果我選擇一個已經使用過的儲物櫃,並通過我的解決方案進行更新,我可以在視圖中成功更新學生信息,但儲物櫃不會更新。