ruby-on-rails – 无法在postgresql(rails)中的json字段中存储数组,无法将数组转换为json

ruby-on-rails – 无法在postgresql(rails)中的json字段中存储数组,无法将数组转换为json,第1张

概述这是我运行db:migrate时遇到的错误 rake aborted!can't cast Array to json 这是我的桌子 class CreateTrips < ActiveRecord::Migration def change create_table :trips do |t| t.json :flig 这是我运行db:migrate时遇到的错误

rake aborted!can't cast Array to Json

这是我的桌子

class CreateTrips < ActiveRecord::Migration          def change            create_table :trips do |t|              t.Json :flights              t.timestamps            end          end         end

这是在我的seeds.rb文件中

flights = [{    depart_time_hour: 600,arrive_time_hour: 700,passengers: [        {            user_ID: 1,request: true            }    ]}]trip = Trip.create(  {    name: 'Flight',flights: flights.to_Json   })

出于某种原因,我不能这样做.如果我这样做

trip = Trip.create(      {        name: 'Flight',flights: { flights: flights.to_Json }      }    )

有用.我不想这样,因为现在我必须使用trip.flights.flights访问Json数组.不是我想要的行为.

解决方法 执行摘要:这是一个已知的 issue,并在 pull request中解决,在撰写本文时正等待合并.

长版:

好吧,基于Array / Hash,我可以看到它为什么以及如何失败/成功.这是进行类型转换的Rails方法(来自quoting.rb),它显然不支持从Ruby Array转换为Postgres Json,而它支持从Hash进行转换.此外,我在此方法的开头添加了一些调试代码,发现使用flight或flights.to_Json作为值无关紧要,因为后者为了此转换而转换为前者.我将进行更多挖掘,因为使用psql将flights.to_Json的值插入到Json列中没有问题.

def type_cast(value,column,array_member = false)      return super(value,column) unless column      case value      when Range        return super(value,column) unless /range$/ =~ column.sql_type        PostgresqlColumn.range_to_string(value)      when NilClass        if column.array && array_member          'NulL'        elsif column.array          value        else          super(value,column)        end      when Array        case column.sql_type        when 'point' then PostgresqlColumn.point_to_string(value)        else          return super(value,column) unless column.array          PostgresqlColumn.array_to_string(value,self)        end      when String        return super(value,column) unless 'bytea' == column.sql_type        { :value => value,:format => 1 }      when Hash        case column.sql_type        when 'hstore' then PostgresqlColumn.hstore_to_string(value)        when 'Json' then PostgresqlColumn.Json_to_string(value)        else super(value,column)        end      when IPAddr        return super(value,column) unless ['inet','cIDr'].include? column.sql_type        PostgresqlColumn.cIDr_to_string(value)      else        super(value,column)      end    end

我继续将以下行添加到Array案例中:

when 'Json' then PostgresqlColumn.Json_to_string(value)

然后更改了PostgresqlColumn.Json_to_string(在cast.rb中)来 *** 作Array和Hash类型的参数,我能够让你的用例通过.

此时我还没有检查是否存在任何问题或请求

顺便说一句,我假设你知道你可以通过使用文本字段而不是Json字段来解决这个问题. Json为您提供的唯一一件事我知道是否在数据库级别进行验证.如果你认为这很重要,我会有兴趣知道为什么,因为我在网络应用程序中有一些带有Json内容的文本字段我正在研究并且我想知道转换它们的好处,如果有的话.

总结

以上是内存溢出为你收集整理的ruby-on-rails – 无法在postgresql(rails)中的json字段中存储数组,无法将数组转换为json全部内容,希望文章能够帮你解决ruby-on-rails – 无法在postgresql(rails)中的json字段中存储数组,无法将数组转换为json所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1283805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存