いくつかの既存のカテゴリを持つアプリケーションがあり、さらにカテゴリを追加したいと考えています。追加のカテゴリがいくつか引用されているので、これをシード ファイルに追加すると思いました。
既存のカテゴリを上書きしたくないので、find_or_create メソッドを使用して、この質問に基づいて:name
andを追加しています。:category_parent_id
だから私はシードファイルに以下を追加しました
categories = Category.find_or_create_by_name_and_category_parent_id(
{name: "TV", category_parent_id: 2},
{name: "Oven", category_parent_id: 2},
{name: "Fridge", category_parent_id: 2},
{name: "Microwave", category_parent_id: 2},
{name: "Toaster", category_parent_id: 2}
)
カテゴリ テーブルに一致するエントリがない場合にコンソールでこれを実行すると得られる出力は次のとおりです。
Category Load (0.5ms) SELECT "categories".* FROM "categories" WHERE "categories"."name" = 'Microwave' AND "categories"."category_parent_id" = 2 LIMIT 1
(0.3ms) BEGIN
Category Exists (0.6ms) SELECT 1 AS one FROM "categories" WHERE "categories"."name" = 'Microwave' LIMIT 1
SQL (18.8ms) INSERT INTO "categories" ("category_parent_id", "category_type", "created_at", "name", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["category_parent_id", 2], ["category_type", nil], ["created_at", Fri, 15 Mar 2013 14:41:53 EST +11:00], ["name", "Microwave"], ["updated_at", Fri, 15 Mar 2013 14:41:53 EST +11:00]]
(0.8ms) COMMIT
=> #<Category id: 31, name: "Microwave", created_at: "2013-03-15 03:41:53", updated_at: "2013-03-15 03:41:53", category_type: nil, category_parent_id: 2>
したがって、これはシード ファイルから 1 つのエントリのみを追加しました。これらのいずれも存在しない場合、なぜそれらすべてが入力されていないのですか?
助けてくれてありがとう。:)
JIM と JOHN に感謝します
Jim と John のおかげで、次のソリューションで動作するようにコードを変更することができました。
category_options = [
{name: "TV", category_parent_id: 2},
{name: "Oven", category_parent_id: 2},
{name: "Fridge", category_parent_id: 2},
{name: "Microwave", category_parent_id: 2},
{name: "Toaster", category_parent_id: 2}
]
categories = category_options.each do |c|
Category.find_or_create_by_name_and_category_parent_id(c)
end