2015-08-16 103 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