未知属性:user_id

时间:2012-07-17 19:23:04

标签: ruby-on-rails ruby activerecord

我收到错误未知属性: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'字段。有什么想法吗?

3 个答案:

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