Rails 4 ActiveRecords:通过验证一次保存多条记录

时间:2015-12-09 18:15:36

标签: ruby-on-rails ruby-on-rails-4 activerecord

您好我有以下情况。我可以保存这个哈希数组

activator reload

立刻

products = [{
   :name=> 0,
   :key  => 12345,
   :label => "test1",
  },{
   :name=> 0,
   :key  => 12145,
   :label => "test",    
  }]

products.map {|p| Product.new(p).save }  

但是我所有的唯一性验证都是

Product.create(products)
Product.create!(products)
使用rails控制台忽略

。我可以多次保存这个哈希。有没有人有一些建议?提前谢谢!

就像重新启动我的rails控制台一样简单。之后,我的日志看起来像@Akadisoft的日志。

也使用这种方式:

validates :key, presence: true, uniqueness: true

返回一个带有布尔products.map {|p| Product.new(p).save } 的数组,或者保存或不保存记录,这对于进一步评估很有用。

2 个答案:

答案 0 :(得分:1)

我已经尝试过您的确切解决方案,一切都按照意图进行..

我第一次运行命令Product.create(products)时,我得到以下结果

=> #<ActiveRecord::Relation [#<Product id: 1, key: "12345", name: 0, label: "test1", created_at: "2015-12-09 19:21:01", updated_at: "2015-12-09 19:21:01">, #<Product id: 2, key: "12145", name: 0, label: "test", created_at: "2015-12-09 19:21:01", updated_at: "2015-12-09 19:21:01">]>

我们可以看到它创建了两个产品(id:1和id:2)。

现在第二个我在这里运行完全相同的命令是结果:

[#<Product id: nil, key: "12345", name: 0, label: "test1", created_at: nil, updated_at: nil>, #<Product id: nil, key: "12145", name: 0, label: "test", created_at: nil, updated_at: nil>]
irb(main):015:0>

我们可以看到ID为nil,因为它没有保存产品。我还可以在控制台输出中看到数据库事务已回滚。

答案 1 :(得分:1)

我在控制台上尝试了这个,它只添加了一条记录。

14:42 $ rails c
Loading development environment (Rails 4.2.5)
2.2.2 :001 > products = [{:key =>1},{:key=>1}]
 => [{:key=>1}, {:key=>1}] 
2.2.2 :002 > products.map {|p| Product.new(p).save }
   (0.1ms)  begin transaction
  Product Exists (0.1ms)  SELECT  1 AS one FROM "products" WHERE "products"."key" = 1 LIMIT 1
  SQL (0.8ms)  INSERT INTO "products" ("key", "created_at", "updated_at") VALUES (?, ?, ?)  [["key", 1], ["created_at", "2015-12-09 19:42:32.488255"], ["updated_at", "2015-12-09 19:42:32.488255"]]
   (0.4ms)  commit transaction
   (0.0ms)  begin transaction
  Product Exists (0.1ms)  SELECT  1 AS one FROM "products" WHERE "products"."key" = 1 LIMIT 1
   (0.0ms)  rollback transaction
 => [true, false] 
2.2.2 :003 > Product.all
  Product Load (0.2ms)  SELECT "products".* FROM "products"
 => #<ActiveRecord::Relation [#<Product id: 1, key: 1, created_at: "2015-12-09 19:42:32", updated_at: "2015-12-09 19:42:32">]>