我无法使用两个单独的多个关联表来提取我需要的数据。
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。我在第一个回答之后阅读了一些关于连接的内容,并且似乎在控制台中有些工作。这在应用程序中并不是很有效,我只是想把它包围得更好一点。
DOUBLE EDIT:
所以我想我只是厌倦了并且过度思考问题。我没有意识到的是列表是由一个用户创建的,所以我能够相当简单地解决这个问题。
def edit
@list = List.find(params[:id])
user = current_user
@meals = Meal.all.where(user_id: user.id)
@listed_meals = @list.meals
end
我无法相信我花了多少时间。感谢您花时间看这个。有时协会会让我感到困惑,有时候看起来很简单。
答案 0 :(得分: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