У меня возникли проблемы с переносом данных, которые мне нужны, с использованием двух отдельных многих для многих связанных таблиц.Две отдельные таблицы has_many
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :meals
has_many :lists
end
class Meal < ActiveRecord::Base
belongs_to :user
has_many :meal_lists
has_many :lists, through: :meal_lists
has_many :meal_ingredients
has_many :ingredients, through: :meal_ingredients
end
class List < ActiveRecord::Base
has_many :meal_lists
has_many :meals, through: :meal_lists
belongs_to :user
end
class MealList < ActiveRecord::Base
belongs_to :meal
belongs_to :list
end
Мой конечный результат должен быть в состоянии вытащить все блюда, которые оба связаны с list_id и user_id.
До сих пор я пытался
@list = @user.lists.create("name: "users list")
list.meals.create(name:"List name", user_id: user.id)
list.meals.where(user_id: user.id)
Я не могу показаться, чтобы выяснить, как вытащить блюда, которые оба связаны с user_id и list_id.
EDIT: после прочтения первого ответа вот как я интерпретировал, как его реализовать. Имейте в виду, что я все еще нахожусь в начале обучения рельсов, и я смотрел на эту проблему часами, и чем больше я смотрю, тем более неясным кажется.
Я создал метод в модели:
Class List < ActiveRecord::Base
def self.find_user_meals(user, list)
meal = Meal.joins(:meal_lists)
user_meal = meal.where(user: user)
list_meal = user_meal.where(meal_lists: { list: list })
return list_meal.distinct
end
end
и внутри моего контроллера:
def edit
@list = List.find(params[:id])
user = current_user
@meals = Meal.all
@all_user_meals = List.find_user_meals(user, @list)
end
И в представлении я просто перебрать @all_user_meals. Я немного поучаствовал в объединениях и включил после первого ответа, и, похоже, что-то поработал в консоли. Это не совсем работает в приложении, и я просто пытаюсь немного обернуть вокруг себя немного лучше.
DOUBLE EDIT:
Так что я думаю, я просто устал и overthinking проблемы. Я не понял, что списки создаются одним пользователем, поэтому я смог решить это довольно просто.
def edit
@list = List.find(params[:id])
user = current_user
@meals = Meal.all.where(user_id: user.id)
@listed_meals = @list.meals
end
Не могу поверить, сколько времени я потратил на это. Спасибо, что потратили время на это. Иногда ассоциации путают меня, иногда они кажутся простыми.
Спасибо за ответы. Я отредактировал комментарий с вопросом о том, как он реализован, потому что я все еще немного запутался. –
Выяснил это. Спасибо за помощь! –