# <ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: такого столбца нет: users.sender_id: - PullRequest
0 голосов
/ 26 августа 2018

Я строю три модели в своем приложении для рельсов.Одна модель дважды ссылается на одну и ту же модель, как показано в моей Схеме БД .Единственная проблема заключается в том, что когда я делаю 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 & receive_id - это в основном User_ID в столбце users.Любая помощь будет высоко ценится!

Это мой файл user.rb:

class User < ApplicationRecord
    has_many :shipments 
end

Это мой груз. 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

Это мой ship__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

И моя схема.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 голосов
/ 26 августа 2018

Вы не хотите изменять primary_key для ваших belongs_to связей: это столбец идентификатора другой таблицы (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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...