есть одна связь, которая приводит к 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 2

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, так что он будет добавлен в вашу таблицу категорий по умолчанию.