【问题标题】:Two separate has_many tables两个单独的 has_many 表
【发布时间】:2016-04-17 07:53:23
【问题描述】:

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

   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。我在第一个答案之后读了一点连接和包含,并且似乎在控制台中得到了一些工作。这在应用程序中不太有效,我只是想更好地理解它。

双重编辑:

所以我想我只是累了,想多了这个问题。我没有意识到这些列表是由一个用户创建的,所以我能够相当简单地解决这个问题。

def edit
    @list = List.find(params[:id])
    user = current_user
    @meals = Meal.all.where(user_id: user.id)
    @listed_meals = @list.meals
  end

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我编辑了评论,并提出了一个关于它是如何实现的问题,因为我仍然有点困惑。
    • 想通了。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多