質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

4895閲覧

RailsでSeedデータを保存しようとすると、外部キーがNOT NULL constraint failed

chantsuka

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/04/03 06:05

編集2016/04/03 06:26

以下の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データ】
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

【スキーマ】
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

いくつか項目を間引きましたが、記載されている内容とほぼ同じ構成でseedを実行できました。
10件以下だと失敗する、というのは不可解ですね。。

belongs_to: member は書いてあるとして(無ければそもそも失敗しますが。。)、
puts member.inspect などのデバッグコードを仕込んで、どういう変数が作られているか、ご確認いただけますでしょうか。

環境はRuby2.3.0 / Rails4.2.6で試しました。

ちなみに下記のuploaded_imageというカラムがmember_imageに無いように見えますが無関係でしょうか。

MemberImage.create(
member: member,
uploaded_image: file
)

投稿2016/04/03 08:31

yoshiky

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chantsuka

2016/04/04 00:35

ご回答頂きありがとうございます!! デバッグコード仕込んで変数を確認したところ、、、 テストデータの10個目がバリデーションで引っかかっていた為に10個目以降のデータが作成されていないようでした。 だいぶ初歩的なエラーで悲しいですが、yoshikyさんのお陰で解決できました。 本当にありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問