has_one关系导致ActiveModel :: MissingAttributeError,我在这里缺少什么?

时间:2014-03-27 07:35:55

标签: ruby-on-rails activerecord has-one

我觉得我在这里忽略了一些明显的东西。我可以创建故事模型和类别模型,但我无法将故事与类别联系起来。

以下是我重现错误的方法:

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 个答案:

答案 0 :(得分:1)

在您的故事模型中,将has_one :category更改为belongs_to :category。根据经验,如果您有模型的外键,则将关联声明为belongs_to。在此示例中,您在故事模型中有category_id,因此您可以在故事模型中使用belongs_to :category。这是完全合理的,因为故事应该属于类别和类别has_many stories

答案 1 :(得分:0)

您在迁移中遗漏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

答案 2 :(得分:0)

您的story_id模型中缺少 foreign_key Category。在您的类别表中添加该列并进行迁移。这将解决您的问题。

注意:在迁移更改之前,请回滚上一次迁移。

OR

最好的方法是 @bekicot 建议。只需添加t.references :story即可。这包括story_id,因此默认情况下会将其添加到您的类别表中。