와 has_many 관계는 5.1레일 오, 나는 레일에서 사용자 정의 이름을 가진 <code>has_many</code> 관계에 문제가 있어요 정의 이름 검사 오류
내가 사용자와 도메인 모델을 가지고, 카탈로그 및 즐겨 찾기에서 항목. 사용자는 많은 즐겨 찾기 항목을 가질 수 있습니다.
즐겨 찾기에 추가 항목이있을 수 있습니다.
나는 소재 기존 응용 프로그램 수정에 대한 학습 운동으로이 일을 해요, 그래서 전용 마이그레이션 각 관계를 추가했습니다 :
class AddUserToFavourite < ActiveRecord::Migration[5.1]
def change
add_reference :favourites, :user, foreign_key: true
end
end
class AddItemToFavourite < ActiveRecord::Migration[5.1]
def change
add_reference :favourites, :item, foreign_key: true
end
end
class AddAdditionalItemsToFavourite < ActiveRecord::Migration[5.1]
def change
add_reference :favourites, :additional_item, foreign_key: { to_table: :items }
end
end
결과 스키마는 다음과 같습니다
ActiveRecord::Schema.define(version: 20170921111049) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "favourites", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.bigint "user_id"
t.bigint "item_id"
t.bigint "additional_item_id"
t.index ["additional_item_id"], name: "index_favourites_on_additional_item_id"
t.index ["item_id"], name: "index_favourites_on_item_id"
t.index ["user_id"], name: "index_favourites_on_user_id"
end
create_table "items", force: :cascade do |t|
t.string "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_foreign_key "favourites", "items"
add_foreign_key "favourites", "items", column: "additional_item_id"
add_foreign_key "favourites", "users"
end
이를 내 모델의 모습입니다.
# user.rb
class User < ApplicationRecord
has_many :favourites
end
# item.rb
class Item < ApplicationRecord
belongs_to :additional_item, class_name: 'Favourite', optional: true
end
# favourite.rb
class Favourite < ApplicationRecord
belongs_to :user
belongs_to :item
has_many :additional_items, class_name: 'Item', foreign_key: 'additional_item_id'
end
이것은 내 모델입니다. 나는이 오류 테스트를 실행하면
# favourite_spec.rb
require 'rails_helper'
RSpec.describe Favourite, type: :model do
it { should belong_to :user }
it { should belong_to :item }
it { should have_many(:additional_items).with_foreign_key('additional_item_id') }
it 'can be created with no additional items' do
expect(Favourite.create!(name: 'Name', user: User.create!, item: Item.create!).additional_items).to be_empty
end
end
: 4,813,210은
ActiveRecord::StatementInvalid:
PG::UndefinedColumn: ERROR: column items.additional_item_id does not exist
LINE 1: SELECT 1 AS one FROM "items" WHERE "items"."additional_item...
^
: SELECT 1 AS one FROM "items" WHERE "items"."additional_item_id" = $1 LIMIT $2
나는 오류가 무엇을 의미하는지 이해합니다. 테이블 items
에는 additional_item_id
열이 없습니다. 당신은 스키마에서도 그것을 볼 수 있습니다.
내가 이해할 수없는 것은 왜 그곳에 있어야하는 이유입니까? 즐겨 찾기 테이블에 외래 키가 충분하지 않습니까?
모델에서 마이그레이션 또는 관계를 작성하는 방법에 문제가 있습니까?
저는 Rails와 DB 이론과 디자인이 매우 녹슬었기 때문에 제가 만든 어리석은 실수를 지적하십시오. 감사합니다 :)