2017-04-24 16 views
1

我有一個rails系統,其中存在由用戶輸入的數據,並且在某些情況下,他們在創建具有相似名稱的記錄時出錯。在模型級別更正記錄中的拼寫錯誤的軌道

我實際上不允許內容重複(相同的名稱和分配)也許這就是爲什麼它不工作。

我有2種型號:

:question 
belongs_to :content 

:content 
has_many :questions 
belongs_to assignature 

我需要做的是合併2條記錄,如果在更新名稱後場找到現有的記錄。

即。

內涵的 名=「這是一個測試」

內容B 名=「這是測試」

我想內涵的重新命名爲NAME =「這是測試」,合併記錄.questions,並摧毀內容A.

更新

由於@Thomas R.科爾讓我感動的邏輯控制器,事情現在的工作,但我不得不做一個奇怪的解決方法來繞過我的唯一性限制。

contents_controller 

def_update 

existent = Content.where(nombre: params[:content][:nombre]).where(assignature_id: params[:content][:assignature_id]) 
     if existent.present? 
      @content.questions.update_all(content_id: existent.first.id) 
#if params nombre is equals to existent , model wont update    
params[:content][:nombre] = "dummy" 
     end 
... 

content.rb 

after_update :clean_empty_contents 

    def clean_empty_contents 
    #delete if content has no questions (applies to my system) 
    Content.includes(:questions).where(questions: {id: nil}).destroy_all 
    end 

我與此代碼嘗試沒有成功:

content.rb 
validates :nombre, uniqueness: { scope: [:assignature_id], :case_sensitive => false} 

before_update :correction 

    def correction 
    existent = Content.find_by(nombre: self.nombre, assignature: self.assignature).first 
    if existent 
     existent.questions = existent.questions + self.questions 
     self.destroy 
    end 
    end 

回答

0

從經驗上來講,儘量用你的correction方法更加明確,並傳遞給它,你想合併的對象。爲什麼?因爲您可能碰巧在該對象上並嘗試與自身合併。得到它了?

雖然我們在它,merge_into!描述它比correction更好。添加!因爲你在摧毀一些東西。 def merge_into!(other) # this faster than loading other.questions questions.update_all(content_id: other.id) # Some safety check would be nice, even better, look into Paranoia. self.destroy end

+0

感謝您的快速回答,我有點失落如何實現這一點,我應該使用before_update嗎?並且我應該從控制器傳遞ID嗎?問候 – llermaly

+0

從控制器傳遞對象。 –

+0

我得到「無法修改冷凍哈希錯誤」,一些stackoverflow答案說這是因爲我試圖使用一個被破壞的元素。我刪除了破壞行和工作,問題被重新分配,但屏幕沒有重定向,元素沒有被更新,即使我聲明self.name =「dummy」,也會玩這個 – llermaly