我收到错误未知属性:user_id执行current_user.stories.build
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'字段。有什么想法吗?
答案 0 :(得分:27)
Kulbir是正确的,您需要在user_id
表中定义stories
列,但不解释这样做的方法。
进行此更改的正确方法是创建新迁移。按照惯例,它应该被称为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将假定您指定的相同类名和外键。
答案 1 :(得分:2)
您的user_id
表格中应该有stories
字段,如下所示,以定义模型中的关联。
<击> 撞击>
<击>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的答案以获得详细解释。
答案 2 :(得分:0)
您应该使用新语法并将fieldtype作为符号传递
add_column :stories, :user_id, :integer