1

Ich habe Probleme, die Daten, die ich benötige, mit zwei separaten vielen bis vielen zugeordneten Tabellen zu ziehen.Zwei separate has_many Tabellen

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 

Mein Ergebnis ist in der Lage sein, alle Mahlzeiten zu ziehen, die sowohl mit dem list_id verbunden sind und die user_id.

Bisher habe ich versucht,

@list = @user.lists.create("name: "users list") 
list.meals.create(name:"List name", user_id: user.id) 
list.meals.where(user_id: user.id) 

Ich kann nicht scheinen, um herauszufinden, wie die Mahlzeiten zu ziehen, die sowohl mit der user_id verbunden sind und die list_id.

EDIT: Nach dem Lesen der ersten Antwort hier ist, wie ich interpretiert, wie man es implementiert. Denken Sie daran, ich bin immer noch am Anfang des Lernens von Schienen und ich habe dieses Problem stundenlang angeguckt und je mehr ich anstarre, desto dunkler scheint es.

habe ich eine Methode im Modell:

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 

und in meinen Controller:

def edit 
    @list = List.find(params[:id]) 
    user = current_user 
    @meals = Meal.all 
    @all_user_meals = List.find_user_meals(user, @list) 
    end 

Und in der Ansicht, die ich durchlaufen gerade @all_user_meals über. Ich habe ein bisschen in Joins gelesen und nach der ersten Antwort eingefügt und scheinbar etwas in der Konsole zum Laufen gebracht. Dies funktioniert nicht ganz in der App, und ich versuche nur, meinen Kopf etwas besser zu umschließen.

DOUBLE EDIT:

So war ich glaube, ich nur müde und Grübeln das Problem. Was ich nicht bemerkte, war, dass die Listen von einem Benutzer erstellt wurden, also konnte ich das ziemlich einfach lösen.

def edit 
    @list = List.find(params[:id]) 
    user = current_user 
    @meals = Meal.all.where(user_id: user.id) 
    @listed_meals = @list.meals 
    end 

Ich kann nicht glauben, wie viel Zeit ich damit verbracht habe. Danke, dass Sie die Zeit damit verbracht haben, sich das anzusehen. Manchmal verwechseln mich Assoziationen, manchmal scheinen sie einfach zu sein.

Antwort

2

Sie können es ein für die Beantwortung zwischen Meal und 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

Dank Verwendung kommen. Ich habe den Kommentar mit einer Frage, wie es umgesetzt wird, bearbeitet, weil ich immer noch ein wenig verwirrt bin. –

+0

Ich habe es herausgefunden. Danke für die Hilfe! –