#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?