确定。昨天问这个问题,从那以后开始了一个全新的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”??
谢谢!
答案 0 :(得分:0)
看起来你在两个模型中有你的关联。 belongs_to
应该列在其表中包含关联列的模型中(在本例中为countertype_id)。 has_one
依赖相关模型来获取此列。
另外几点意见:
Countertop.last
的输出,Countertype_Id
具有大写字符。这可能不会导致sqlite立即出现问题,但是可能值得更改以避免任何未来的问题,因为Rails会假设列名总是被降级,除非另有明确说明。@countertops
(复数),但show视图仅使用@countertop
。