我觉得我在这里忽略了一些明显的东西。我可以创建故事模型和类别模型,但我无法将故事与类别联系起来。
以下是我重现错误的方法:
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
答案 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
,因此默认情况下会将其添加到您的类别表中。