

以下のseedデータを追加しようとすると、

> NOT NULL constraint failed: member_images.member_id: INSERT INTO
> "member_images"

というエラー表示がされますが理由がわかりません。

なお、`0.upto(9)`の部分を`0.upto(8)`にすると保存できます。  
つまり、member_imagesテーブルのid1~9までは外部キーが保存できるのですが、id10以上は外部キーが保存されないため`NOT NULL
constraint failed`となります。

このエラーで丸一日かかっており、ぜひご教授頂きたいです。  
よろしくお願いいたします。

【テーブル】  
members(参照元,primrykey保持)  
member_images(membersテーブルを参照する)

【seedデータ】

[code]

    names = %w(Taro Jiro Hana John Mike Sophy Bill Alex Mary Tom)
    fnames = ["佐藤", "鈴木", "高橋", "田中"]
    gnames = ["太郎", "次郎", "花子"]
    affiliations = ["東京大学法学部","株式会社リクルート","カヤック"]
    intros = ["プログラミングを学びたいと思っています。","JSの効率的な学習方法を教えます。"]
    0.upto(9) do |idx|
        member = Member.create(
            name: names[idx],
            full_name: "#{fnames[idx % 4]} #{gnames[idx % 3]}",
            email: "#{names[idx]}@example.com",
            birthday: "1981-12-01",
            gender: [0, 0, 1][idx % 3],
            affiliation: "#{affiliations[idx % 3]}",
            intro: "#{intros[idx % 2]}",
            administrator: (idx == 0),
            password: "password",
            password_confirmation: "password"
        )
        path = Rails.root.join("db/seeds/development", "member#{idx % 3 + 1}.jpg")
        file = Rack::Test::UploadedFile.new(path, "image/jpeg", true)
        MemberImage.create(
            member: member,
            uploaded_image: file
        )
    end
    
[/code]

【スキーマ】

[code]

    create_table "member_images", force: :cascade do |t|
        t.integer  "member_id",    null: false
        t.binary   "data"
        t.string   "content_type"
        t.datetime "created_at",   null: false
        t.datetime "updated_at",   null: false
        end
    
        add_index "member_images", ["member_id"], name: "index_member_images_on_member_id"
    
        create_table "members", force: :cascade do |t|
        t.string   "name",                            null: false
        t.string   "full_name"
        t.string   "email"
        t.date     "birthday"
        t.integer  "gender",          default: 0,     null: false
        t.text     "affiliation"
        t.text     "intro"
        t.boolean  "administrator",   default: false, null: false
        t.datetime "created_at",                      null: false
        t.datetime "updated_at",                      null: false
        t.string   "hashed_password"
    end
    
[/code]


CC BY-SA 3.0
2016-04-03T06:11:02.217
23694
2016-11-22T16:39:14.600
2016-04-03T07:52:18.280
3068
15014
question
ruby-on-rails ruby sqlite
RailsでSeedデータを保存しようとすると、外部キーがNOT NULL constraint failed


以下の部分を

[code]

    member = Member.create(
    
[/code]

このように変更して実行してみてください。

[code]

    member = Member.create!(
    
[/code]

エラーになっているのはMemberImageをcreateする際に渡しているmemberがDBに保存されていないからだと思います。（↓この部分↓）

[code]

    MemberImage.create(
        member: member,
        uploaded_image: file
    )
    
[/code]

おそらくMember.create時にバリデーションエラーが発生しているのでしょう。`create!`メソッドを使用すれば、バリデーションエラーがあった時に例外が発生するようになるので、なぜ保存できないかが分かります。


CC BY-SA 3.0
2016-04-04T05:41:38.733
23724
2016-04-04T05:41:38.733
9608
23694
answer