1

У меня возникли проблемы с переносом данных, которые мне нужны, с использованием двух отдельных многих для многих связанных таблиц.Две отдельные таблицы 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 

Не могу поверить, сколько времени я потратил на это. Спасибо, что потратили время на это. Иногда ассоциации путают меня, иногда они кажутся простыми.

ответ

2

Вы можете сделать это с помощью соединения между Meal и MealList

Meal.joins(:meal_lists) 
    .where(user: @user) 
    .where(meal_lists: { list: @list }) 
    .distinct # because the joins may return duplicate meals if they belong to several lists 
+0

Спасибо за ответы. Я отредактировал комментарий с вопросом о том, как он реализован, потому что я все еще немного запутался. –

+0

Выяснил это. Спасибо за помощь! –

Смежные вопросы