两个单独的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都关联的餐食。

编辑:看完第一个答案后,我解释了如何实现它。请记住,我还处于学习轨道的初期,我已经盯着这个问题看了好几个小时了,我看得越多,它看起来就越模糊。

我在模型中创建了一个方法:

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

我简直不敢相信我花了这么多时间在这上面。谢谢你花时间看这个。有时联想会让我感到困惑,有时它们看起来很简单。

您可以使用MealMealList 之间的联接来完成此操作

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

相关内容

  • 没有找到相关文章

最新更新