我在视图上收到以下错误消息:http://localhost:3000/microposts/2 SQLite3 :: SQLException:没有这样的列:answers.micropost_id:SELECT“answers”。* FROM“answers”WHERE(“answers”.micropost_id = 2)
以下是我的迁移:
class CreateMicroposts < ActiveRecord::Migration
def self.up
create_table :microposts do |t|
t.string :content
t.timestamps
end
end
def self.down
drop_table :microposts
end
end
class CreateAnswers < ActiveRecord::Migration
def self.up
create_table :answers do |t|
t.string :location
t.text :body
t.references :micropost
t.integer :micropost_id
t.timestamps
end
end
def self.down
drop_table :answers
end
end
答案控制器:
def create
@answer = Answer.new(params[:answer])
@answer.micropost = @micropost; @answer.save && @micropost.save
redirect_to micropost_path(@micropost)
respond_to do |format|
if @answer.save
format.html { redirect_to(@answer, :notice => 'Answer was successfully created.') }
format.xml { render :xml => @answer, :status => :created, :location => @answer }
else
format.html { render :action => "new" }
format.xml { render :xml => @answer.errors, :status => :unprocessable_entity }
end
end
end
和视图:
<p id="notice"><%= notice %></p>
<p>
<b>Content:</b>
<%= @micropost.content %>
<h2>Location Answers:</h2>
<% @micropost.answers.each do |answer| %>
<p>
<b>Answer:</b>
<%= answer.body%>
</p>
<%end %>
<h2> Answer a location:</h2>
<%= form_for ([@micropost, @micropost.answers.build]) do |f| %>
<div class="field">
<%= f.label :location %><br />
<%= f.text_field :location %>
</div>
<div class="field">
<%= f.label :body %><br/>
<%= f.text_area :body %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
</p>
<%= link_to 'Edit', edit_micropost_path(@micropost) %> |
<%= link_to 'Back', microposts_path %>
我在这个应用程序中找不到什么问题。 - 我试图回滚并再次迁移它没有用。 - 我试图在迁移中手动添加“t.integer:micropost_id”它不起作用 我的模型有'belongs_to'和“has_many”的关联,我添加了“ 资源:微博 资源:答案 结束 到我的config.rb文件。
答案 0 :(得分:2)
我相信has_many关联需要一个关系表来加入。如果你有has_one和belongs_to(一对一关联)使用简单的_id列方法,但has_many不会。因此,如果您将此连接表放入并通过它描述has_many,您应该得到您想要的。
这是rails associations的一个非常好的指南,当我对这些东西不清楚时,我会使用它。
答案 1 :(得分:2)
您无需在迁移中设置 micropost_id 。这是通过 t.references
完成的create_table :answers do |t|
t.string :location
t.text :body
t.references :micropost
t.timestamps
end
设置和索引的最佳做法,例如:
add_index :answers, :micropost_id