14

我收到错误未知属性:执行 current_user.stories.build 期间的 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'
  ...

架构.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”字段。有任何想法吗?

4

3 回答 3

28

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模型中,您可以指定 justhas_many :stories并在Story模型中指定belongs_to :user。Rails 将假定您指定的类名和外键相同。

于 2012-07-17T19:34:51.937 回答
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

编辑

查看艾米丽的答案以获取详细说明。

于 2012-07-17T19:28:20.057 回答
0

您应该使用新语法并将字段类型作为符号传递

add_column :stories, :user_id, :integer
于 2013-05-16T23:30:51.330 回答