【问题标题】:Get ActiveRecord::StatementInvalid in Orders#show in Ruby on Rails app after resetting db重置数据库后在 Ruby on Rails 应用程序中获取 ActiveRecord::StatementInvalid #show
【发布时间】:2016-02-11 20:10:21
【问题描述】:

我在我的 Ruby on Rails 应用程序中尝试执行以下操作时收到以下错误 渲染表单。

特别是,我收到此错误:

 SQLite3::SQLException: no such column: deliveries.order_id: SELECT 
"deliveries".* FROM "deliveries" WHERE "deliveries"."order_id" = ?

在 show.html.haml 文件中引用这两行作为原因:

= render @order.deliveries

= render "deliveries/form"

这是 form.html.haml 文件:

=simple_form_for([@order, @order.deliveries.build]) do |f|
   =f.input :name, input_html: { class: "form-control"}
   =f.input :deliveryaddress, input_html: { class: "form-control"}
   =f.input :deliverytime, input_html: { class: "form-control"}
   =f.input :notes, input_html: { class: "form-control"}
   %br/
   =f.button :submit class: "btn btn-primary btn-lg"

这是我的部分交付 _deliveries.html.haml:

%p= delivery.name
%p= delivery.deliveryaddress
%p= delivery.deliverytime
%p= delivery.notes

这是我的deliveries_controller.rb:

class DeliveriesController < ApplicationController
    def create
      @order = Order.find(params[:order_id])  #find the order the delivery is   associated with in the controller
      @deilvery = @order.deliveries.create(params[:order].permit(:name, :deliveryaddress, :deliverytime, :notes))
      redirect_to order_path(@order)
    end
end

另外,我已经尝试过 'rake db:drop db:create db:migrate' 和 'rake db:test:prepare'。

这是我的 schema.rb:

ActiveRecord::Schema.define(version: *) do

create_table "deliveries", force: :cascade do |t|
t.string   "name"
t.string   "deliveryaddress"
t.integer  "deliverytime"
t.string   "notes"
t.integer  "orders_id"
t.datetime "created_at",      null: false
t.datetime "updated_at",      null: false
end

 add_index "deliveries", ["orders_id"], name: "index_deliveries_on_orders_id"

create_table "orders", force: :cascade do |t|
t.datetime "date"
t.string   "name"
t.string   "pickup"
t.datetime "pickuptime"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

我认为这可能是路线错误,但我不确定。

如何解决此错误?谢谢。

【问题讨论】:

  • 从您的 schema.rb 添加迁移和相关条目。但该错误意味着您缺少交货表上的 order_id 列。所以要么删除类之间的关系,要么确保列在那里
  • 我已经在上面包含了我的 schema.rb,这似乎表明我的交付表中已经有一个 "orders_id" 列。这是问题所在(因为它是复数而不是单数)?如果是这样,你建议我如何解决它?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

在这里做一些假设,但如果您遵循 Rails 标准,那么您的专栏命名错误:

class Order < ActiveRecord::Base
  has_many :deliveries
end

class Delivery < ActiveRecord::Base
  belongs_to :order
end

所以这需要存在 order_id 列,而不是 orders_id。 要解决此问题,您需要进行以下迁移:

class RenameOrderIdsCOlumn < ActiveRecord::Migration
  def up
     rename_column(:deliveries, :order_ids, :order_id)
  end
end

【讨论】:

  • 谢谢你,NekoNova!抱歉,不确定如何实施此迁移,我不想造成任何其他错误。要实施此修复,我是否只需在命令行中输入:'rails generate migration RenameOrderIdsColumn order_id:string'?
  • 使用命令rails g migration RenameOrderIdsColumn 然后用我给你的代码更新生成的文件。然后使用rake db:migrate 运行迁移
【解决方案2】:

如果要更改列名?

在 rails 4 中使用此命令生成迁移以重命名列。

rails g migration ChangeOrderIdToOrdersId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2018-11-11
    • 2012-07-29
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多