Ruby on rails Rails多态关联显示在控制台中,但不在视图中

Ruby on rails Rails多态关联显示在控制台中,但不在视图中,ruby-on-rails,methods,parent-child,polymorphic-associations,rails-console,Ruby On Rails,Methods,Parent Child,Polymorphic Associations,Rails Console,在我正在开发的一个应用程序中,我遇到了一个问题,即在用户和食谱的饮食要求之间匹配多态关联。在控制台中,我可以实现这一点——如果我将饮食需求ID等于“[2]”的用户与具有相同孩子的食谱相匹配,它就会起作用 然而,当我运行应用程序时,尽管调用了相同的用户和配方,但比较这两个用户和配方的方法计算结果为“false” 希望这是清楚的,这里有一个小代码来解释这一点: 在控制台中 one = User.first two = Recipe.first one.dietary_requirement_ids.

在我正在开发的一个应用程序中,我遇到了一个问题,即在用户和食谱的饮食要求之间匹配多态关联。在控制台中,我可以实现这一点——如果我将饮食需求ID等于“[2]”的用户与具有相同孩子的食谱相匹配,它就会起作用

然而,当我运行应用程序时,尽管调用了相同的用户和配方,但比较这两个用户和配方的方法计算结果为“false”

希望这是清楚的,这里有一个小代码来解释这一点:

在控制台中

one = User.first
two = Recipe.first
one.dietary_requirement_ids.any? && ((one.dietary_requirement_ids & two.dietary_requirement_ids) == one.dietary_requirement_ids)
# returns true, as it should
但是,在视图中…

我使用视图可访问的帮助器方法,如下所示:

  def dietary_requirement_matcher(one, two)
    one.dietary_requirement_ids.any? && ((one.dietary_requirement_ids & two.dietary_requirement_ids) == one.dietary_requirement_ids)
  end
因此:

<% Recipe.all.each do |recipe| %>
    <li><%= dietary_requirement_matcher(@user, recipe) %></li>
  <% end %> 
<!-- which all return false, including those that shouldn't! -->
@user.inspect
调出正确的用户。但是,
@user.dietary\u requirement\u ids.inspect
调出一个空数组(尽管仍在控制台中工作)

我已经检查了用户和配方是否都正确保存在控制台中


这里有一些额外的代码,可以很方便地解决这个问题:

型号

配方

has_many :dietary_requirements, as: :classifiable
使用者

饮食需求

belongs_to :classifiable, polymorphic: true
控制器

@recipes = Recipe.all
@user = current_user #auth method - debug shows this picking up the correct user in the view, albeit not their dietary requirements
查看(不完整,用于在修复此问题时进行调试)


我在想,这可能是建立多态性关联的方式:饮食需求可能属于
用户
,也可能属于
配方
,因为您在两者上都使用了
:classifiable
参考列。我也遇到过类似的问题,我的解决方案是向多态类添加两个独立的引用列,如下所示:

  • 饮食需求
    属于:所有者,多态性:真
    属于:处理器,多态性:真
    。然后将以下列添加到
    膳食需求
    表中:
    所有者id、所有者类型、处理者id、处理者类型

  • 配方<代码>有许多:饮食要求,如::处理器

  • 用户<代码>有许多:饮食要求,如::所有者

谢谢@Dimitry\u N-我希望尽可能避免对模型进行重组,因为它在其他地方运行良好。在控制台中,我可以访问具有单一共享饮食需求的用户和食谱(即,两者都包含“素食者”,ID:2),这只是为了转移到我正在努力解决的视图。这对你有意义吗?下面继续……如果我只是感到困惑,请告诉我,但我的理解是,使用多态关系意味着不需要额外的列。不是这样吗?(在其他地方,我刚刚使用了两个连接模型,因为它有很多贯穿性,而且生活更简单!)我添加了页面在加载数据时如何查看数据的日志,希望这有助于揭示问题。再次感谢。另一个更新-我已经了解了你的意思,共享DR具有可分类的_类型“Recipe”,而SQLite正在寻找可分类的_类型“User”。有没有办法克服这个问题,或者我需要按照你的建议进行调整?谢谢你的帮助——它似乎让我找到了问题的根源,帮助我理解了一个负载。我现在会找到解决办法的,我听到了)。我认为使用多态关联的主要原因是避免创建不必要的联接表。在您的情况下,这将是UserDietaryRequests和RecepieDietaryRequirements,而不是使用具有三个类和无联接表的多态关联。是的,你可以按你想要的方式调整类型。这里有一个类似的问题,我在不久前发布过。看一看:明白了,谢谢你的帮助。我会玩一出戏,然后再打给你!
belongs_to :classifiable, polymorphic: true
@recipes = Recipe.all
@user = current_user #auth method - debug shows this picking up the correct user in the view, albeit not their dietary requirements
<ul>
  <% Recipe.all.each do |recipe| %>
    <li><%= recipe.name %> = <%= dietary_requirement_matcher(@user, recipe) %></li>
  <% end %>
</ul>

<p><%= dietary_requirement_matcher(@user, Recipe.first) %></p> <!-- returns false, when I'm after true -->
<p><%= @user.dietary_requirements.inspect %></p> <!-- returns '#<ActiveRecord::Associations::CollectionProxy []>' -->
Started GET "/fridges/meals" for 151.229.93.203 at 2015-02-17 16:26:42 +0000
Processing by FridgesController#meals as HTML
#code for matching User Ingredients to Recipe Ingredients      
User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 2]]
   (0.3ms)  SELECT COUNT(*) FROM "recipes"
  Recipe Load (0.3ms)  SELECT "recipes".* FROM "recipes"
  Ingredient Exists (0.2ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 1]]
  Fridge Load (0.2ms)  SELECT  "fridges".* FROM "fridges" WHERE "fridges"."user_id" = ? LIMIT 1  [["user_id", 2]]
   (0.2ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "fridge_ingredients" ON "ingredients"."id" = "fridge_ingredients"."ingredient_id" WHERE "fridge_ingredients"."fridge_id" = ?  [["fridge_id", 5]]
   (0.2ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 1]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 1]]
   (0.2ms)  SELECT "dietary_requirements".id FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  Ingredient Load (0.2ms)  SELECT "ingredients".* FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 1]]
  Ingredient Exists (0.1ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 2]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "fridge_ingredients" ON "ingredients"."id" = "fridge_ingredients"."ingredient_id" WHERE "fridge_ingredients"."fridge_id" = ?  [["fridge_id", 5]]
   (0.1ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 2]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 2]]
  Ingredient Exists (0.1ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 3]]
  Ingredient Exists (0.1ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 4]]
  Rendered shared/_matcher.html.erb (21.3ms)
  CACHE (0.0ms)  SELECT "recipes".* FROM "recipes"
  CACHE (0.0ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 1]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "fridge_ingredients" ON "ingredients"."id" = "fridge_ingredients"."ingredient_id" WHERE "fridge_ingredients"."fridge_id" = ?  [["fridge_id", 5]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 1]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 1]]
  CACHE (0.0ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 2]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "fridge_ingredients" ON "ingredients"."id" = "fridge_ingredients"."ingredient_id" WHERE "fridge_ingredients"."fridge_id" = ?  [["fridge_id", 5]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 2]]
  CACHE (0.0ms)  SELECT "ingredients".id FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ?  [["recipe_id", 2]]
  CACHE (0.0ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 3]]
  CACHE (0.0ms)  SELECT  1 AS one FROM "ingredients" INNER JOIN "recipe_ingredients" ON "ingredients"."id" = "recipe_ingredients"."ingredient_id" WHERE "recipe_ingredients"."recipe_id" = ? LIMIT 1  [["recipe_id", 4]]
#code for matching the User and Recipe Dietary Requirements
  CACHE (0.0ms)  SELECT "recipes".* FROM "recipes"
  CACHE (0.0ms)  SELECT "dietary_requirements".id FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  CACHE (0.0ms)  SELECT "dietary_requirements".id FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  CACHE (0.0ms)  SELECT "dietary_requirements".id FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  CACHE (0.0ms)  SELECT "dietary_requirements".id FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  Recipe Load (0.4ms)  SELECT  "recipes".* FROM "recipes"  ORDER BY "recipes"."id" ASC LIMIT 1
  CACHE (0.0ms)  SELECT "dietary_requirements".id FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  DietaryRequirement Load (0.2ms)  SELECT "dietary_requirements".* FROM "dietary_requirements" WHERE "dietary_requirements"."classifiable_id" = ? AND "dietary_requirements"."classifiable_type" = ?  [["classifiable_id", 2], ["classifiable_type", "User"]]
  Rendered fridges/meals.html.erb within layouts/application (42.3ms)
  Cuisine Load (0.3ms)  SELECT "cuisines".* FROM "cuisines"
  Category Load (0.2ms)  SELECT "categories".* FROM "categories"
  Rendered shared/_header.html.erb (3.3ms)
Completed 200 OK in 593ms (Views: 579.3ms | ActiveRecord: 4.2ms)