есть одна связь, которая приводит к ActiveModel:: MissingAttributeError, что я здесь упускаю?
Я чувствую, что упускаю из виду нечто очевидное. Я могу создать модель истории и модель категории, но я не могу связать историю с категорией.
Вот как я воспроизвожу ошибку:
s = Story.new(title: "test", picture_url: "www.google.com")
c = Category.last
s.category = c
Ошибка: ActiveModel:: MissingAttributeError: не удается записать неизвестный атрибут 'story_id'
Модель сюжета
class Story < ActiveRecord::Base
has_many :chapters, dependent: :destroy
has_many :users, through: :story_roles
has_one :category
end
Файл переноса истории
class CreateStories < ActiveRecord::Migration
def change
create_table :stories do |t|
t.string :title
t.string :picture_url
t.integer :category_id
t.timestamps
end
end
end
Модель категории
class Category < ActiveRecord::Base
belongs_to :story
validates_presence_of :body
end
Миграция категорий
class CreateCategories < ActiveRecord::Migration
def change
create_table :categories do |t|
t.string :body
t.timestamps
end
end
end
3 ответа:
Вы пропускаете
t.references :story
в вашей миграции. Метод belongs_to для категории требуетstory_id
.class CreateCategories < ActiveRecord::Migration def change create_table :categories do |t| t.references :story t.string :body t.timestamps end end end
В вашей модели истории измените
has_one :category
наbelongs_to :category
. Эмпирическое правило состоит в том, что если у вас есть внешний ключ для модели, вы объявляете ассоциацию какbelongs_to
. В этом примере у вас естьcategory_id
в модели истории, поэтому вы используетеbelongs_to :category
в модели истории. Это имеет смысл, поскольку история действительно должна принадлежать к категории и категорииhas_many stories
.
Вы пропускаете иностранный ключ
story_id
в вашей моделиCategory
. Добавьте этот столбец в таблицу категорий и перенесите его.Это решит вашу проблему.Примечание: перед переносом изменений выполните откат предыдущей миграции.
Или
Лучший способ-это то, что предложил@bekicot . Просто добавьте
t.references :story
. Это включает в себяstory_id
, так что он будет добавлен в вашу таблицу категорий по умолчанию.