#<activerecord :: statementinvalid:sqlite3 :: sqlexception:=“” no =“” such =“” column:=“” users.sender_id:=“”

时间:2018-08-26 14:17:11

标签: sql ruby-on-rails database activerecord

=“ “

我正在Rails应用程序中构建三个模型。一个模型两次引用同一模型,如我的DB Schema所示。唯一的问题是,当我发出POST请求以在货运表中创建新记录时。我收到此错误:

#<ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.sender_id: SELECT  \"users\".* FROM \"users\" WHERE \"users\".\"sender_id\" = ? LIMIT ?>

我认为不需要在用户表中添加sender_id和receive_id列,因为sender_id和receiver_id基本上是users列中的User_ID。任何帮助将不胜感激!

这是我的user.rb文件:

class User < ApplicationRecord
    has_many :shipments 
end

这是我的shipping.rb

class Shipment < ApplicationRecord
  belongs_to :sender, class_name: "User", primary_key: "sender_id"
  belongs_to :receiver, class_name: "User", primary_key: "receiver_id"

  validates_uniqueness_of :tntcode
end

这是我的shipss_controller:

class ShipmentsController < ApplicationController

    def index 
        shipments = Shipment.all
    end 

    def show
        shipment = Shipment.find(params[:id])
    end 

    def create
        shipment = Shipment.new(shipment_params)
      
        if shipment.save
          render json: {status: 'Shipment created successfully'}, status: :created
        else
          render json: { errors: shipment.errors.full_messages }, status: :bad_request
        end
    end 
    
    def shipment_params
        params.require(:shipment).permit(:tntcode, :status, :shipment_type, :weight, :content, :price, :sender_id, :receiver_id)
    end
end

还有我的schema.rb:

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

  create_table "shipments", force: :cascade do |t|
    t.integer "tntcode"
    t.string "status"
    t.string "shipment_type"
    t.integer "weight"
    t.string "content"
    t.integer "price"
    t.integer "sender_id"
    t.integer "receiver_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["receiver_id"], name: "index_shipments_on_receiver_id"
    t.index ["sender_id"], name: "index_shipments_on_sender_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email", null: false
    t.string "role"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "photourl"
    t.string "userid"
  end

end

1 个答案:

答案 0 :(得分:0)

您不想更改您的primary_key关联上的belongs_to:这是另一个表的ID列(id)。

您反而想要:

belongs_to :sender, class_name: "User", foreign_key: "sender_id"
belongs_to :receiver, class_name: "User", foreign_key: "receiver_id"

...这是默认设置,因此也应该起作用:

belongs_to :sender, class_name: "User"
belongs_to :receiver, class_name: "User"