Rails:保存父记录后立即自动创建关联记录

时间:2015-08-14 03:21:54

标签: mysql ruby-on-rails associations has-many-through

我正在尝试在父记录保存后立即在子表中自动创建记录,但我遇到困难并需要帮助如何执行此操作。

所以Orgs的表层次结构就像Org-> Brand-> Restaurant (例如,Americana(Org) - > KFC(Brand) - > San Francisco(餐厅))。

品牌有很多菜单,菜单属于品牌。现在我想从品牌菜单中为每个餐厅级联菜单,因为我想要由餐厅管理价格。为了做到这一点,我创建了一个'local_menus'表,其中包含restaurant_id和menu_id,这样我就不必复制一些数据,local_menus中的更改不会影响其父级。

问题是如何在创建父菜单后立即在'local_menus'中自动创建记录。更具体地说,当我创建menuA时,需要为该品牌下的所有餐馆自动创建相同的菜单。感谢您的支持。

模型:

class LocalMenu < ActiveRecord::Base
  belongs_to :restaurant
  belongs_to :menu
end

class Menu < ActiveRecord::Base
    has_many :local_menus
    belongs_to :brand
end

class Restaurant < ActiveRecord::Base
    has_many :menus, through: :local_menus
end

TABLES:

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


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"

restaurants
    t.string   "name",          limit: 255
    t.string   "name_kana",     limit: 255
    t.integer  "price",         limit: 4
    t.boolean  "active_status", limit: 1
    t.integer  "brand_id",      limit: 4

1 个答案:

答案 0 :(得分:0)

一种方法是使用:after_create回调为所有品牌的餐厅创建本地菜单。

class Menu < ActiveRecord::Base

  after_create: :build_local_menus_for_brand

  def build_local_menus_for_brand
    brand.restaurants.each do |restaurant|
      self.local_menus.create!(restaurant_id: restaurant.id)
    end
  end
end