在rails应用程序的表中显示查询结果

时间:2016-10-18 22:12:22

标签: ruby-on-rails ruby

我有3个型号如下。

项目模型

        window.onload = function(){
            var bsDiv = document.getElementById("box");
            var x, y;
// On mousemove use event.clientX and event.clientY to set the location of the div to the location of the cursor:
            window.addEventListener('mousemove', function(event){
                x = event.clientX;
                y = event.clientY;                    
                if ( typeof x !== 'undefined' ){
                    bsDiv.style.left = x + "px";
                    bsDiv.style.top = y + "px";
                }
            }, false);
        }
    </script>

和成分模型

class Item < ApplicationRecord
    belongs_to :item_type, :class_name=>ItemType, :foreign_key=>"item_type_id"
end

和recipe_ingredients的模型

class Ingredient < ApplicationRecord
    validates_presence_of :ingredient, :message=>"name cannot be blank!"
end

成分表有以下栏目

class RecipeIngredient < ApplicationRecord
  belongs_to :item, :class_name=>Item, :foreign_key=>"item_id"
  belongs_to :ingredient, :class_name=>Ingredient, :foreign_key=>"ingredient_id"
  validates_numericality_of :quantity
end

配方成分指数的视图如下。成分出现在视图中。我想从配料表中取出所选配料的配方单元并将其显示在表格中。我试过它做一个查询。代码如下。

"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"ingredient" varchar, 
"inventory_unit" varchar, 
"recipe_unit" varchar, 
"created_at" datetime NOT NULL, 
"updated_at" datetime NOT NULL

但我得到的输出如下图所示。

enter image description here

3 个答案:

答案 0 :(得分:1)

好的,它显示的是因为你显示的是整个类,而不是实例的实际细节。

在下面的这种情况下,您选择了一整套成分(该集合仅包含一种成分,但它将始终返回一组):

Ingredient.select('recipe_unit').where(:id => @ingredient_id)

你可能想要的是这样的:

Ingredient.find(@ingredient_id).recipe_unit

差异:

  1. 其中始终返回一组项目(即使集合中只有一个项目)返回的内容不是成分,而是活动关系。要返回一种成分,您需要使用findfirst(或类似的方法)。
  2. select告诉Rails从数据库中取出什么...它不告诉模板在模板中显示什么。它说“只从db中获取recipe_unit列”它没有说and then output the recipe_unit column - 因为你需要在成分上实际调用recipe_unit方法(如我给出的例子)。
  3. 请注意,recipe_ingredient.item存在同样的问题 您要显示项目中的哪一列?它是否有namedescription,如果是这样的话 - 您需要实际调用它,例如:

    <%= recipe_ingredient.item.name %>
    

答案 1 :(得分:1)

首先,由于convention over configuration,您可能会忽略模型中的:class_name:foreign_key - 您的模型的名称与您列出的类和外键完全相同。

至于你的问题,你需要使用yak shaving

recipe_ingredient.ingredient.recipe_unit

答案 2 :(得分:1)

您只需输入以下内容:

recipe_ingredient.ingredient.recipe_unit

为什么这可能?

由于RecipeIngredient属于Ingredient,您可以访问Ingredient的{​​{1}},就像它是这样的任何其他字段一样:

RecipeIngredient

获得成分后,您可以通过输入以下内容直接拉出recipe_unit:

recipe_ingredient.ingredient

旁注:

您可以在模型类中省略关联性规则中的recipe_ingredient.ingredient.recipe_unit :class_name哈希值。例如,参加这个课程:

:foreign_key

按照惯例,rails会将Student类与Course类相关联。 Rails将在&#34;学生&#34;中寻找专栏。标有&#34; course_id&#34;的数据库表,以及&#34; course_id&#34;作为表中的列存在,Rails将自动使用该字段作为Student的外键。如果要覆盖rails中的默认约定,可以使用class Student < ActiveRecord::Base belongs_to Course end 表示法(除非严格要求,否则不建议这样做)。

有关活动记录迁移和外键关联主题的更多阅读,您可以查看rails docs