find_or_create_by_field1_and_field2未按预期工作

时间:2013-03-15 03:46:01

标签: ruby-on-rails ruby-on-rails-3

我有一个现有类别的应用程序,并希望为其添加更多类别。由于引用了一些其他类别,我认为我会将其添加到种子文件中。

我不想覆盖任何现有类别,因此我使用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个条目。如果这些都不存在,为什么不进入它们呢?

感谢您的帮助。 :)


感谢吉姆和约翰

感谢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

1 个答案:

答案 0 :(得分:1)

您无法使用find_or_create_by_*创建多个记录。它只会创建一条记录。你所看到的有点奇怪,但我怀疑它与非确定性哈希排序和一些幸运的参数解释有关。

检查activerecord-import一次插入多条记录。它不会像find-or-create-by那样简单;你必须做一个单独的查找并找出要创建的内容,理想情况是在交易中或其他什么,但它会表现得相当好。