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.
Dank Verwendung kommen. Ich habe den Kommentar mit einer Frage, wie es umgesetzt wird, bearbeitet, weil ich immer noch ein wenig verwirrt bin. –
Ich habe es herausgefunden. Danke für die Hilfe! –