两个独立的has_many表

时间:2016-04-17 07:53:23

标签: ruby-on-rails postgresql associations model-associations

我无法使用两个单独的多个关联表来提取我需要的数据。

   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

我无法相信我花了多少时间。感谢您花时间看这个。有时协会会让我感到困惑,有时候看起来很简单。

1 个答案:

答案 0 :(得分:2)

您可以使用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