加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 无法在postgresql(rails)中的json字段中存储数

发布时间:2020-12-17 02:45:41 所属栏目:百科 来源:网络整理
导读:这是我运行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
这是我运行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内容的文本字段我正在研究并且我想知道转换它们的好处,如果有的话.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读