2013-03-15 5 views
0

У меня есть приложение с некоторыми существующими категориями и вы хотите добавить к нему дополнительные категории. Поскольку есть цитата из нескольких дополнительных категорий, я думал, что добавлю это в файл семени.find_or_create_by_field1_and_field2 не работает как ожидалось

Я не хочу переписывать существующие категории, поэтому я использую метод find_or_create для добавления :name и :category_parent_id на основе этого вопроса.

Rails find_or_create by more than one attribute?

Поэтому я добавил следующее в мой файл семян

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 запись из файла семени. Если никто из них не существует, почему все они не вводятся?

Спасибо за любую помощь. :)


ОТВЕТИЛ БЛАГОДАРЯ Джимом 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 
+1

Я не думаю, что find_or_create принимает хэш или массив. Вам, вероятно, придется перебирать их. – johnkoht

+0

Хммм, я даже не думал об этом, но теперь это имеет смысл. Спасибо :) –

ответ

1

Невозможно создать несколько записей с помощью find_or_create_by_*. Он создаст только одну запись. То, что вы видите, немного странно, но я подозреваю, что это связано с недетерминированным хэш-упорядочением и некоторой интерпретацией удачных параметров.

Отъезд activerecord-import для вставки нескольких записей одновременно. Это не будет так просто, как найти или создать; вам нужно будет сделать отдельную находку и выяснить, что создавать, идеально в транзакции или что-то в этом роде, но она будет действовать достаточно хорошо.

+0

Спасибо за ответ, который дал мне идею о том, как это решить. :) Хотя я не использовал activerecord-import, я нашел довольно легкую работу. –

Смежные вопросы