如何在显示或索引

时间:2015-10-02 01:22:37

标签: mysql ruby-on-rails ruby-on-rails-4

确定。昨天问这个问题,从那以后开始了一个全新的rails应用程序,看看从头开始是否有帮助。

以下是此应用的工作原理。用户将创建一个新的台面并输入他们的邮政编码,台面尺寸和台面类型。可能的台面类型存储在名为“Countertype”的模型中。用户通过collection_select方法选择countertype,该方法列出了Countertype表中的所有条目。对此台面形式的回复保存在台面表中,该表具有“countertop_id”整数列。

当用户登陆Show然后登录Index页面时,我希望可以看到countertype的名称而不是整数。

我该怎么做?这太痛苦了。

这是我的架构:

create_table "countertops", force: :cascade do |t|
 t.string   "counterzip"
 t.string   "countersize"
 t.datetime "created_at",     null: false
 t.datetime "updated_at",     null: false
 t.integer  "countertype_id"
end

create_table "countertypes", force: :cascade do |t|
 t.string   "name"
 t.datetime "created_at", null: false
 t.datetime "updated_at", null: false
end

这是我的索引和节目

def index
 @countertops = Countertop.all
 @countertops = Countertop.includes(:countertype).all
end

def show
 @countertops = Countertop.all
 @countertops = Countertop.includes(:countertype).all
end

Countertop.rb:

class Countertop < ActiveRecord::Base
 has_one :countertype
end

Countertype.rb

class Countertype < ActiveRecord::Base
 belongs_to :countertop
end

显示:

<p>
  <strong>Counter Type:</strong>
  <%= @countertop.countertype.name %>
</p>

指数:

<% @countertops.each do |countertop| %>
  <tr>
    <td><%= countertop.counterzip %></td>
    <td><%= countertop.countertype.name %>

这是我的控制台对两个表的读数。

Countertop.last
  Countertop Load (0.2ms)  SELECT  "countertops".* FROM "countertops"  ORDER            BY "countertops"."id" DESC LIMIT 1
=> #<Countertop id: 1, counterzip: "19111", countersize: "100", created_at:    "2015-10-01 20:44:29", updated_at: "2015-10-01 20:44:29", Countertype_Id: 1> 
2.2.1 :029 > 

Countertype.last
 Countertype Load (0.7ms)  SELECT  "countertypes".* FROM "countertypes"  ORDER BY "countertypes"."id" DESC LIMIT 1
  => #<Countertype id: 1, name: "Granite", created_at: "2015-10-01 20:15:12", updated_at: "2015-10-01 20:15:12"> 

Heres的错误信息:     SQLite3 :: SQLException:没有这样的列:countertypes.countertop_id:SELECT“countertypes”。* FROM“countertypes”WHERE“countertypes”。“countertop_id”=?限制1

将节目更改为&lt;%= @ countertops.countertype_id%&gt;显示“1”。

我需要修复它才能显示“Granite”而不是“1”??

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来你在两个模型中有你的关联。 belongs_to应该列在其表中包含关联列的模型中(在本例中为countertype_id)。 has_one依赖相关模型来获取此列。

另外几点意见:

  • 根据Countertop.last的输出,Countertype_Id具有大写字符。这可能不会导致sqlite立即出现问题,但是可能值得更改以避免任何未来的问题,因为Rails会假设列名总是被降级,除非另有明确说明。
  • 您的#show控制器方法定义了@countertops(复数),但show视图仅使用@countertop