我在使用两个独立的多对多关联表提取所需数据时遇到问题。
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都关联的餐食。
编辑:看完第一个答案后,我解释了如何实现它。请记住,我还处于学习轨道的初期,我已经盯着这个问题看了好几个小时了,我看得越多,它看起来就越模糊。
我在模型中创建了一个方法:
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。我在第一个答案后读了一点join和includes,似乎在控制台中找到了一些工作。这在应用程序中不太起作用,我只是想更好地理解它。
双重编辑:
所以我想我只是累了,想太多了。我没有意识到的是,列表是由一个用户创建的,所以我能够非常简单地解决这个问题。
def edit
@list = List.find(params[:id])
user = current_user
@meals = Meal.all.where(user_id: user.id)
@listed_meals = @list.meals
end
我简直不敢相信我花了这么多时间在这上面。谢谢你花时间看这个。有时联想会让我感到困惑,有时它们看起来很简单。
您可以使用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