14

current_user.stories.build の実行中にエラー unknown attribute: 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」フィールドは含まれていません。何か案は?

4

3 に答える 3

28

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の規則に従っている場合は、実際には余分な仕様の多くをスキップできます。モデルでは justをUser指定でき、モデルでは を指定できます。Rails は、指定したものと同じクラス名と外部キーを想定します。has_many :storiesStorybelongs_to :user

于 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 に答える