Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 未转换为整数数组的字符串数组_Ruby On Rails_Arrays - Fatal编程技术网

Ruby on rails 未转换为整数数组的字符串数组

Ruby on rails 未转换为整数数组的字符串数组,ruby-on-rails,arrays,Ruby On Rails,Arrays,我试图理解以下行为: irb(main):016:0* pg = ProductGroup.find(1) irb(main):017:0> pg.good_type_ids => [1] irb(main):018:0> pg.update({"good_type_ids"=>["", "1"]}) irb(main):019:0> pg.changed? => false irb(main):020:0> pg.good_type_ids =>

我试图理解以下行为:

irb(main):016:0* pg = ProductGroup.find(1)
irb(main):017:0> pg.good_type_ids
=> [1]
irb(main):018:0> pg.update({"good_type_ids"=>["", "1"]})
irb(main):019:0> pg.changed?
=> false
irb(main):020:0> pg.good_type_ids
=> ["1"]
上面的代码模拟了表单更新。好的\u类型\u ID是多选的选定ID。虽然数组的值从[1]更改为[“1”],但是?方法返回false。update方法似乎也足够聪明,可以去掉空字符串

irb(main):021:0> pg = ProductGroup.find(1)
irb(main):022:0> pg.good_type_ids
=> [1]
irb(main):023:0> pg.attributes = {"good_type_ids"=>["", "1"]}
=> {"good_type_ids"=>["", "1"]}
irb(main):024:0> pg.changed?
=> true
irb(main):025:0> pg.good_type_ids
=> ["", "1"]
在第二个示例中,我尝试将更改后的参数从表单应用到对象。我不想把它保存到dbs! 不知何故,attributes方法的行为与update方法不同,在调用该方法后,良好的_type_id将为[“”,“1”]

“update”和“attributes”方法似乎考虑了dbs中列的类型,仅对于数组(postgres),这似乎不起作用

irb(main):030:0* pg.attributes = {"recourse_days"=>5}
=> {"recourse_days"=>5}
irb(main):031:0> pg.changed?
=> true
irb(main):039:0* pg.recourse_days
=> 5
追索权天数定义为整数,在post期间,控制器接收字符串并将其正确转换为整数

Schema.rb:t.integer“good_type_id”,默认值:[],数组:true

作为周围的临时工作,我已将其放入控制器的更新方法中

params["good_type_ids"].reject!(&:blank?)
params["good_type_ids"].map!(&:to_i)    
UPD

在rails 4.2.0中,字符串转换问题和保存到pgsql的nil元素似乎已经得到了解决,我听说整个类型转换系统在这里进行了很大的修改:

> doc.test_digit = ["1"] #=> ["1"] 
> doc.test_digit #=> [1] 
> doc.test_string #=> ["2"] 
> doc.test_string = [2] #=> [2] 
> doc.test_string #=> ["2"]
>   doc.attributes = {'test_digit'=>["", "2"]}
 => {"test_digit"=>["", "2"]} 
> doc.test_digit #=> [nil, 2] 
> doc.save
   (0.9ms)  BEGIN
  SQL (1.8ms)  UPDATE "documents" SET "test_digit" = $1, "updated_at" = $2 WHERE "documents"."id" = $3  [["test_digit", "{NULL,2}"], ["updated_at", "2015-02-26 00:32:25.326735"], ["id", 1]]
   (3.7ms)  COMMIT
 => true 
> doc.reload 
  Document Load (1.7ms)  SELECT  "documents".* FROM "documents" WHERE "documents"."id" = $1 LIMIT 1  [["id", 1]]
 => #<Document id: 1, name: "test1", test_digit: [nil, 2], test_string: ["2"], created_at: "2015-02-25 23:51:32", updated_at: "2015-02-26 00:32:25"> 

> doc.test_digit #=> [nil, 2]

更新方法更新数据库,因此模型属性不再脏

update方法似乎也足够聪明,可以去掉空字符串

irb(main):021:0> pg = ProductGroup.find(1)
irb(main):022:0> pg.good_type_ids
=> [1]
irb(main):023:0> pg.attributes = {"good_type_ids"=>["", "1"]}
=> {"good_type_ids"=>["", "1"]}
irb(main):024:0> pg.changed?
=> true
irb(main):025:0> pg.good_type_ids
=> ["", "1"]

这不是正常的行为,根据pgsql适配器/array_解析器的来源,空数组元素应该作为任何其他值保存和加载。(此功能已添加到适配器上,以防您使用旧版本)

哪种方法是
好的\u类型\u ID
?它是来自多个关联,还是一个序列化字段?(或其他什么?)它在数据库中是什么类型的列?在sql控制台中查看数据库时,数据库中实际存储了什么?是否使用PostgreSQL?“数组”是Postgres中的列类型。这意味着,不是Rails处理转换,而是您的实际DBMS在进行转换,您看到的就是这种行为。参阅good_type_id可以被视为getter/setter。Schema.rb:t.integer“good_type_ids”,默认值:[],数组:true bevior变得陌生。在dbs中,好的类型ID的值是{1}。Rails控制台:
pg=Product.find(1)
pg.attributes={“good\u-type\u-ids”=>[“”,“2”]}
pg.good\u-type\u-ids
=>[“”,“2”]`
在数据库中保存的值是正确的,它是{2}我发现当我重新加载pg.reload时,字符串数组变成了整数数组
pg.reload
pg.good\u type\u id
=>[2]
@MaxWilliams是的,我使用的是PostgreSQL“Array”列类型。我希望active record能够进行转换。可能我对PostgreSQL的这个特定数组实现的期望太高了。如果希望ActiveRecord进行转换,则将其设置为
TEXT
列,并将字段序列化为模型定义中的数组,如
serialize:good_type_id,Array