0

いくつかの既存のカテゴリを持つアプリケーションがあり、さらにカテゴリを追加したいと考えています。追加のカテゴリがいくつか引用されているので、これをシード ファイルに追加すると思いました。

既存のカテゴリを上書きしたくないので、find_or_create メソッドを使用して、この質問に基づいて:nameandを追加しています。:category_parent_id

複数の属性によるRails find_or_create?

だから私はシードファイルに以下を追加しました

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
4

1 に答える 1

1

で複数のレコードを作成することはできませんfind_or_create_by_*。単一のレコードのみが作成されます。あなたが見ているのはちょっと奇妙ですが、非決定論的なハッシュの順序付けといくつかの幸運なパラメーターの解釈に関係しているのではないかと思います.

一度に複数のレコードを挿入するには、activerecord-importを確認してください。検索または作成するほど簡単ではありません。理想的にはトランザクションなどで何を作成するかを個別に検索して把握する必要がありますが、それはかなりうまく機能します。

于 2013-03-15T03:50:46.107 に答える