【问题标题】:fail to create propper habtm scope未能创建适当的 habtm 范围
【发布时间】:2016-10-16 02:44:07
【问题描述】:

我卡住了(。我有两个模型有 habtm 关系。

  create_table "daily_menus", force: :cascade do |t|
    t.string   "day"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.date     "date"
  end

  add_index "daily_menus", ["day"], name: "index_daily_menus_on_day", unique: true, using: :btree

  create_table "daily_menus_dishes", id: false, force: :cascade do |t|
    t.integer "daily_menu_id"
    t.integer "dish_id"
  end

  add_index "daily_menus_dishes", ["daily_menu_id", "dish_id"], name: "index_daily_menus_dishes_on_daily_menu_id_and_dish_id", using: :btree

  create_table "dish_types", force: :cascade do |t|
    t.integer "meal"
  end

  create_table "dishes", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
    t.integer  "dish_type_id"
  end

  add_index "dishes", ["dish_type_id", "name"], name: "index_dishes_on_dish_type_id_and_name", unique: true, using: :btree

还有一张与菜有关系的菜类型表 has_many :dishes。我需要的是一个范围,除了那些已经在菜单中的菜肴之外,所有具有指定类型的菜肴都将包括在内。我在第二天与这个问题作斗争。需要一些帮助。这是我最后一次失败的尝试

  #scope :menu_available, -> (type_id, daily_menu_id){ where('dish_type_id = ?', type_id) & where(joins(:daily_menus).where.not('daily_menu_id = ?', daily_menu_id)) }

  #scope :menu_available, lambda { |type_id, daily_menu_id| joins(:daily_menus).where('dishes.dish_type_id = ? AND daily_menus.id != ?', type_id, daily_menu_id) }
  #scope :menu_available, lambda { |daily_menu_id| joins(:daily_menus).where('daily_menus.id is NULL AND daily_menus.id != ?', daily_menu_id) }
  scope :menu_available,  -> { joins(:daily_menus).where(daily_menus: { id: 17 }) }
  scope :menu_available, -> { where("dish_type_id = ?", 14).joins(:daily_menus).where("daily_menu_id != ?", 17)}

我有一个小小的成功,现在它找到了菜单中没有的所有菜

scope :without_menu, -> { joins('LEFT JOIN daily_menus_dishes ON dishes.id = daily_menus_dishes.dish_id').where('daily_menus_dishes.daily_menu_id is NULL')}

取得更大的成功!

scope :without_menu, -> { joins('LEFT JOIN daily_menus_dishes ON dishes.id = daily_menus_dishes.dish_id').where('daily_menus_dishes.daily_menu_id is NULL OR daily_menus_dishes.daily_menu_id != ?', 14) }

【问题讨论】:

    标签: ruby-on-rails has-and-belongs-to-many


    【解决方案1】:

    这是我得到的,可能它可以重构吗?

     scope :without_menu, -> { joins('LEFT JOIN daily_menus_dishes ON dishes.id = daily_menus_dishes.dish_id').where('daily_menus_dishes.daily_menu_id is NULL OR daily_menus_dishes.daily_menu_id != ?', 14).where(dish_type: 14).order('name ASC') }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2015-10-16
      • 2017-09-06
      • 1970-01-01
      • 2012-01-20
      相关资源
      最近更新 更多