2012-07-17 102 views
10

,我发现了错误未知属性:current_user.stories.build的USER_ID durring执行未知属性:user_id说明

class User < ActiveRecord::Base 
    has_many :stories, class_name: 'Story', foreign_key: 'user_id', dependent: :destroy 
    ... 

class Story < ActiveRecord::Base 
    belongs_to :user, class_name: 'User', foreign_key: 'user_id' 
    ... 

schema.rb

create_table "stories", :force => true do |t| 
    t.string "responsible" 
    t.string "descr" 
    t.string "state" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 

    create_table "users", :force => true do |t| 
    t.string "email" 
    t.string "password_digest" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
    t.string "name" 
    end 

它不包含 'USER_ID'领域。有任何想法吗?

回答

1

您的stories表中应该有一个user_id字段,如下所示,以定义模型中的关联。

create_table "stories", :force => true do |t| 
    t.integer "user_id" 
    t.string "responsible" 
    t.string "descr" 
    t.string "state" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 
    ... 
end 

编辑

检查Emily的详细解释回答。

27

Kulbir是正确的,您需要在stories表中定义user_id列,但没有说明如何实现该操作。

进行该更改的正确方法是创建新的迁移。按照惯例,它应该被称为add_user_id_to_stories并且将如下(假设你使用Rails 3+)创建:

rails generate migration add_user_id_to_stories 

如果运行,它实际上应该产生已包含您所需要的变革迁移做,这应该是这样的:

add_column :stories, :user_id, :integer 

顺便说一句,当你以下有关协会命名,这你是Rails的惯例,实际上你可以跳过很多额外的规范。在User型号中,您可以指定has_many :stories,并在Story型号中指定belongs_to :user。 Rails将使用您指定的相同类名和外键。

+0

感谢修正和进一步的解释! +1 – 2012-07-17 19:37:20

0

你应该使用新的语法,并传递字段类型为符号

add_column :stories, :user_id, :integer