ActiveRecord :: StatementInvalid.SQLite3 :: SQLException: такой таблицы нет - PullRequest
0 голосов
/ 31 мая 2018

Я создаю социальную сеть, и у меня возникла проблема при добавлении запроса на добавление в друзья.Когда я нажимаю кнопку «Добавить друга», консоль Rails показывает мне следующее.

Console error

Миграция дружбы:

class CreateFriendships < ActiveRecord::Migration[5.1]
  def change
    create_table :friendships do |t|
      t.references :user, foreign_key: true
      t.references :friend, foreign_key: true
      t.string :status

      t.timestamps
    end
  end
end

Контроллер:

class FriendshipsController < ApplicationController
    before_action :find_friend,except: [:index,:update]
    before_action :find_friendship, only: [:update]

    def create
        friendship = Friendship.new(user: current_user, friend: @friend)
        respond_to do |format|
            if friendship.save
                format.html { redirect_to @friend }
                format.js
            else
                format.html {redirect_to @friend, notice: "Error!"}
                format.js
            end
        end
    end 

    private     
    def find_friend
        @friend = User.find(params[:friend_id])
    end
end

Модель дружбы:

class Friendship < ApplicationRecord
  include AASM
  belongs_to :user
  belongs_to :friend, class_name: "User"
  validates :user_id, uniqueness:{scope: :friend_id} 

  aasm column: "status" do
    state :pending, initial: true
    state :active
    state :denied
    state :blocked
    event :accepted do
        transitions from: [:pending], to: [:active]
    end

    event :rejected do
        transitions from: [:pending, :active], to: [:denied]
    end

    event :eliminated do
        transitions from: [:pending, :active, :denied], to: [:blocked]
    end
  end
end

Модель пользователя:

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable

  validates :rut, presence: true, uniqueness: true, rut: true
  validates :username, presence: true
  validates :name, presence: true
  validates :email, presence: true

  validate :validate_username_regex

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable,
         :omniauth_providers => [:facebook]


  has_many :posts
  has_many :friendships

  ...
  def self.from_omniauth(auth)
    where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |user|
        if auth[:info]
            user.email = auth[:info][:email]
            user.name = auth[:info][:name]
        end
        user.password = Devise.friendly_token[0,20]
    end
  end
  ...
  private
    def validate_username_regex
      unless username =~ /\A[a-zA-Z]*[a-zA-Z][a-zA-Z0-9_]*\z/
        errors.add(:username,"XYZ...")
        errors.add(:username,"XXXYYYZZZ...")
      end
    end
end

Кнопка добавления друга:

=grid xs:4,sm:2 do
    =button_to friendships_path(friend_id: @user.id),
     method: :post, remote: true, :"data-type" => "script",
     class:"mdl-button mdl-js-button mdl-button--fab 
     mdl-js-ripple-effect" do
        %i.material-icons person_add

Схема:

  create_table "friendships", force: :cascade do |t|
    t.integer "user_id"
    t.integer "friend_id"
    t.string "status"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["friend_id"], name: "index_friendships_on_friend_id"
    t.index ["user_id"], name: "index_friendships_on_user_id"
  end

  create_table "posts", force: :cascade do |t|
    t.text "body"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "username", default: "", null: false
    t.string "name"
    t.string "last_name"
    t.string "rut", default: "", null: false
    t.string "bio"
    t.string "uid"
    ...
    end

end

Rails: Rails 5.1.6

Ruby: ruby ​​2.3.1p112 (2016-04-26) [x86_64-linux-gnu]

Любая идея?: c thx!

1 Ответ

0 голосов
/ 31 мая 2018

Вам необходимо изменить эту миграцию.Из-за ограничений внешнего ключа база данных пытается найти friend запись с идентификатором friend_id

class CreateFriendships < ActiveRecord::Migration[5.1]
  def change
    create_table :friendships do |t|
      t.references :user, foreign_key: true
      t.references :friend, foreign_key: true
      t.string :status

      t.timestamps
    end
  end
end

. Вам необходимо удалить foreign_key из ссылок

t.references :friend, foreign_key: false

добавить foreign_key вручную

add_foreign_key :friendships, :users, column: :friend_id

Окончательное содержимое миграции

class CreateFriendships < ActiveRecord::Migration[5.1]
  def change
    create_table :friendships do |t|
      t.references :user, foreign_key: true

      t.references :friend, foreign_key: false
      # OR
      # t.integer :friend_id, index: true #=> Alternative to above line

      t.string :status

      t.timestamps
    end
    add_foreign_key :friendships, :users, column: :friend_id
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...