2015-08-16 122 views
0

我試圖在父屬性更新後立即更新關聯的表屬性。因此,菜單表是主表,並且無論何時更新主表,都需要更新子表(例如,active_status)中的關聯屬性。爲了做到這一點,我在菜單模型中添加了'after_update'回調。但是,我得到了以下錯誤。我在這裏做錯了什麼?Rails:當父屬性更新時,如何自動更新關聯的表屬性

錯誤

NoMethodError在MenusController#更新未定義的方法`menu_states爲零 :NilClass

提取的源(圍繞線#54):52 53 54 55 56 57

DEF update_menu_states_for_menu @ menu.menu_states do | menu_state | self.menu_states.update_attributes(menu_id:menu_state.id,價格:menu_state.price,active_status:menu_state.active_status) 端端

menu.rb

class Menu < ActiveRecord::Base 
after_update :update_menu_states_for_menu 

    def update_menu_states_for_menu 
    menu.menu_states do |menu_state| 
     self.menu_states.update_attributes!(menu_id: menu_state.id, price: menu_state.price, active_status: menu_state.active_status) 
    end 
    end 

模型

class MenuState < ActiveRecord::Base 
    belongs_to :menu 
end 

class Menu < ActiveRecord::Base 
    has_many :menu_states 
end 

表格

local_menus 
    t.integer "restaurant_id", limit: 4 
    t.integer "menu_id",  limit: 4 
    t.boolean "active_status", limit: 1 
    t.boolean "instock_status", limit: 1 
    t.integer "price",   limit: 4 
    t.integer "selling_price", limit:4 


menus 
    t.integer "restaurant_id",  limit: 4 
    t.string "name",    limit: 255 
    t.integer "price",    limit: 4 
    t.integer "brand_id",   limit: 4 
    t.integer "category_id",  limit: 4 
    t.text  "description",  limit: 65535 
    t.boolean "active_status",  limit: 1 
    t.date  "start_date" 
    t.date  "end_date" 

回答

1

這將是self.menu_states,而不是menu.menu_states

def update_menu_states_for_menu 
    self.menu_states do |menu_state| # 
     menu_state.update_attributes!(menu_id: menu_state.id, price: menu_state.price, active_status: menu_state.active_status) 
    end 
    end 
+0

謝謝,但它並沒有菜單表的更改保存到menu_states表儘管錯誤消失。我期待在菜單更新操作後立即觸發以下SQL語句:「UPDATE'menu_states' SET'price' = xxx,'active_status' = x WHERE'menus'.'id' = xx」 – Kaku