2015-10-10 3 views
1

У меня есть две модели. Первый из них:Внешнего ключа не существует при удалении зависимых записей

class Keyword < ActiveRecord::Base 

    has_many :words, dependent: :delete_all 

end 

Второе:

class Word < ActiveRecord::Base 

end 

Мои Миграции:

class Keywords < ActiveRecord::Migration 
    def change 
    create_table :keywords do |t| 
     t.string :name, null: false, unique: true 
     t.string :description, null: false 
     t.string :keys, null: false 
     t.timestamps null: false 
    end 
    end 
end 

И для слов:

class Words < ActiveRecord::Migration 
    def change 
    create_table :words do |t| 
     t.belongs_to :keyword 
     t.string :name, null: false 
     t.timestamps null: false 
    end 
    end 
end 

Когда я пытаюсь удалить экземпляр ключевых слов Rails выбрасывает мычание исключение:

PG::UndefinedColumn: ERROR: column words.keyword_id does not exist LINE 1: DELETE FROM "words" WHERE "words"."keyword_id" = $1^: DELETE FROM "words" WHERE "words"."keyword_id" = $1 

Так что мой вопрос, почему Rails создал keyword_id ссылку на таблицу вместо использования keywords_id? И как это исправить.

+0

Он должен создать столбец «keyword_id». Как вы пытаетесь удалить запись? – BroiSatse

+0

Через ссылку, на мой взгляд: <% = link_to "удалить", установить, метод:: удалить, данные: {подтвердить: "Вы уверены?" }%> –

+0

Можете ли вы показать действие контроллера? Кроме того, что такое 'set' - это экземпляр« Keyword »? – BroiSatse

ответ

0

Во-первых, вам нужно добавить belongs_to отношение к вашей Word модели:

class Word < ActiveRecord::Base 
    belongs_to :keyword 
end 

Во-вторых, создать столбец keyword_id для внешнего ключа, вам нужно использовать метод add_reference в вашем миграция:

class Words < ActiveRecord::Migration 
    def change 
    create_table :words do |t| 
     t.string :name, null: false 
     t.timestamps null: false 
    end 

    add_reference :words, :keyword, index: true, foreign_key: true 
    end 
end 

Если то, что вы на самом деле хотите, чтобы иметь много-ко-многим, вам нужно добавить таблицу присоединиться, то есть KeywordsWords.

+1

'принадлежит_то' является псевдонимом для метода' reference'. Код миграции правильный. – BroiSatse

+0

Не работает для меня, все та же ошибка. –

+0

@BroiSatse: Спасибо, что указали это. Исправил мой ответ. – Drenmi

0

Код в вашем репозитории фактически отличается от кода миграции, который вы опубликовали. В вашем репо у вас есть:

t.belongs_to :keywords 

Изменить его:

t.belongs_to :keyword 

, как вы писали в этом вопросе, а затем воссоздать базу данных.

+0

Не удалось решить проблему. –

+0

Хорошо, как вы воссоздаете базу данных? – BroiSatse

+0

'rake db: drop && rake db: setup' –

0

Вам необходимо следующее:

#app/models/keyword.rb 
class Keyword < ActiveRecord::Base 
    has_many :words 
end 

#app/models/word.rb 
class Word < ActiveRecord::Base 
    belongs_to :keyword 
end 

Это приведет Rails искать keyword_id внешнего ключа в words таблице:

#words 
id | keyword_id | name | created_at | updated_at 

Похоже, вы должны изменить words таблицу включить внешний код keyword_id:

$ rails g migration ChangeWordsAddKeywordID 

#db/migrate/change_words_add_keyword_id______.rb 
class ChangeWordsAddKeywordID 
    def change 
    rename_column :words, :keywords_ids, :keyword_id 
    ## OR ## 
    create_column :words, :keyword_id, :integer 
    end 
end 

$ rake db:migrate 
Смежные вопросы