2013-10-13 62 views
0

我有兩個ActiveRecord型號,AssignmentInstructionAssignment屬於Instruction導軌 - 保存記錄時自動更新外鍵

當保存一個新的分配時,我想觸發一個回調,該回調根據Assignment中的另一個屬性在分配中插入外鍵。換句話說,如果assignment.assignment_type = instruction.name,請在分配中插入該指令的ID作爲主鍵。

看來你會使用Rails回調。但我不確定如何做到這一點,而不讓模型彼此交談,我收集的是一個壞主意。

編輯1

繼mjnissim的意見,下面我實現了這一點,它的工作原理:

class Assignment < ActiveRecord::Base 
    attr_accessible :game_type, :title, :instruction_id 

    belongs_to :instruction 

    before_save :set_instruction 

    private 

    def set_instruction 
    instruction = Instruction.where(:name => self.game_type).first 
    self.instruction = instruction 
    end 

end 

不過,我還在猶豫編寫set_instruction方法,因爲我覺得模特不能給每個發言其他沒有打破MVC結構。但它確實好嗎?

+1

非常誠實,我不知道它打破了哪個理論,如果它真的存在的話! ;-)我不認爲它會在任何情況下破壞MVC,並且認爲模型會與其他模型有一定程度的合作而不會相互糾纏。想想自己一會兒,試着想象不知道沒有其他物體的無菌模型......它似乎試圖保持一些神聖的原則而犧牲實用性。您也可以查看DCI和「Concerns」文件夾及其使用情況[http://www.artima.com/articles/dci_vision.html](http://www.artima.com/articles/dci_vision.html) – mjnissim

回答

0

俏皮,

模型瞭解對方或使用回調是不是一個壞主意。是個好主意。

但是,我並沒有完全理解你的問題兄弟。每條指令只有一個作業?

無論如何,有很多回調,可以找到on this page,但我認爲你正在尋找的是before_save。嘗試把這個在Assignment模式:

before_save do 
    if some_condition_is_true 
    assign_this = to_that 
    end 
    true 
end 

通知的true底。如果你不返回true它可以取消一些回調中的保存(閱讀我鏈接到的文檔以找出哪些)。 (不用說 - 你可能需要取消保存,所以有時候請正確使用......)

你可能想要在你的回調中使用的另一個有用的東西是_changed?。如果你有一個叫做title例如一個屬性,你可以問這樣的事情:

if title_changed? 
    ... do things... 
end 

_changed?配備免費的,建於使用Rails。

如果您需要澄清請評論,我會嘗試更新我的答案。

+0

非常感謝您的詳細解答。請在我的原始問題中查看編輯1。 – niftygrifty

1

如果賦值爲belongs_to指令,則賦值具有instruction_id屬性。要設置instruction_id你只需要

assignment.instruction = instruction 
+0

mjnissim越來越重視我的問題的核心,但這是有用的,所以+1! – niftygrifty