проблемы с областью действия в habtm

#ruby-on-rails #record

#ruby-на-рельсах #запись

Вопрос:

У меня есть привычные отношения между Dish и Blogenu. Вот область применения

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

Он предназначен для поиска блюд определенного типа, но которые в настоящее время не включены в меню. К сожалению, это работает некорректно. Нужна помощь, пожалуйста
Модель DishType

 class DishType < ActiveRecord::Base
 include DishTypeSetter
 enum meal:[:main_course, :second_course, :drink]   
end
 

Модель тарелки

 class Dish < ActiveRecord::Base
  has_and_belongs_to_many :daily_menus
  has_many :orders
  has_many :users, through: :orders
  belongs_to :dish_type 

  scope :main_meals, -> { joins(:dish_type).where('meal = ?', 0) }
  scope :second_meals, -> { joins(:dish_type).where('meal = ?', 1) }
  scope :drinks, -> { joins(:dish_type).where('meal = ?', 2) }

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


  scope :menu_available, lambda { |type_id, daily_menu_id|
where(joins(:daily_menus).where('daily_menu_id != ? AND dish_type_id = ?', daily_menu_id, type_id))
 

}

   validates :dish_type, :name, presence: true
  validates :name, uniqueness: { scope: :dish_type_id }

end
 

Модель меню

 class DailyMenu < ActiveRecord::Base
 has_and_belongs_to_many :dishes
 has_many :orders
 has_many :users, through: :orders
end
 

Также о модели DishType — у нее есть только ассоциация has_many dishes (я перенес это на беспокойство)/ Но у него нет has_many daily_menus/

 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", force: :cascade do |t|
  t.integer "daily_menu_id"
  t.integer "dish_id"
end

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

create_table "dishes", force: :cascade do |t|
  t.string   "name"
  t.integer  "type"
  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
 

Ответ №1:

 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)
}
 

Комментарии:

1. @anti-k в какой таблице находится daily_menu_id ?

2. @anti-k это столбец в dishes таблице или в daily_menus столбце?

3. @anti-k тогда вы должны использовать его в запросе. Отредактируйте вопрос со всеми моделями, какие столбцы вы хотите использовать в этой области.

4. @anti-k Я отредактировал ответ, посмотрите, как я включил :dish_type joins и использовал эту таблицу в области действия

5. @anti-k итак, вы хотите: блюда с определенным идентификатором dish_type_id и конкретным идентификатором daily_menu_id?