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