简单介绍Ruby on Rails对PostgreSQL数组类型的支持

我非常高兴在宣布Rails 4.0 现在支持 PostgreSQL数组类型. 你可以方便的在migration通过 :array => true里创建数组类型的字段. 创建数组类型的字段的时候还可以添加其它的选项(length,default,等等)

create_table :table_with_arrays do |t|
 t.integer :int_array, :array => true
 # integer[]
 t.integer :int_array, :array => true, :length => 2
 # smallint[]
 t.string :string_array, :array => true, :length => 30
 # char varying(30)[]
end

需要注意在是对数组类型的字段设置默认值的时候,你应该用Postgresql里的写法({value,another value}), 如果你想设置数组类型的字段默认值为空数组的时候,你应该使用:default => '{}'

create_table :table_with_arrays do |t|
 t.integer :int_array, :array => true, :default => '{}'
 # integer[], default == []
 t.integer :int_array, :array => true, :length => 2, :default => '{1}'
 # smallint[], default == [1]
end

在Model里使用Postgresql数组的例子

我们现在有个包含first_name, last_name, nickname的user model, 其中nickname字段是数组类型. 下面的migration代码会创建相应的表:

create_table :users do |t|
 t.string :first_name
 t.string :last_name
 t.string :nicknames, :array => true
end

并且对于这个表,我们有个简单的model

class User < ActiveRecord::Base
 attr_accessible :first_name, :last_name, :nicknames
end

我们没有对字段使用默认值,如果我们实例一个User 对象,代码是这样的.

john = User.create(:first_name => 'John', :last_name => 'Doe')

如果,我们调用john.nickname, 结果会返回nil, 并且在postgreSQL 里存储的是NULL值.

我们通过下面的代码可以在创建时,设置nickname属性值

john = User.create(:first_name => 'John', :last_name => 'Doe',
 :nicknames => ['Jack', 'Johnny'])

如果我们从数据库获取记录,那么nick_name字段会转变成一个数组,而不是返回字符串{Jack, Johnny}!。Rails 4.0拥有一个纯Ruby数组转换器,但是如果你想让转换过程加速,那么就可以使用之前提到的 pg_array_parsergem。PgArrayParser 拥有一个基于C的扩展,还有一个JRuby的Java的实现(即使这个gem现在在JRuby上存在些问题,我正在尝试去解决这个问题。)

有一个重点需要注意的,就是当在一个model中和数组(或者其他可变数值)交互的时候。ActiveRecord现在并没有跟踪"destructive",或者更改发生的地方。这包括数组的push和pop操作。如果你需要使用"destructive"更新,你必须使用call<属性>_will_change!这样可以让ActiveRecord知道你需要更改属性的值。对于我们的这个User model,如果你想在nickname后面追加元素,你可以这样做:

john = User.first

john.nicknames += ['Jackie boy']
# 或者
john.nicknames = john.nicknames.push('Jackie boy')
# 任何时候,属性通过"="赋值,ActiveRecord会跟踪这个更改
john.save

john.reload
john.nicknames
#=> ['Jack', 'Johnny', 'Jackie Boy']

john.nicknames.pop
john.nicknames_will_change!
# '#pop'操作会改变数组的值,所以我们需要告诉ActiveRecord它将会发生更改
john.save

最后一项在Postgresql中使用数组要注意的事情是: 数组没有元素数量限制,可以是多维数组,但是在使用多维数组时, 子数组元素个数必须是一样的.

[[1,2,3], [2,3,4], [4,5,nil]]
# 在PostgreSQL 可用,每个子数组元素个数一样

[1,2,[3,4]]
# 不可用的数组
(0)

相关推荐

  • 图文详解mybatis+postgresql平台搭建步骤

    从头开始搭建一个mybatis+postgresql平台 最近有个项目的数据库使用postgresql,使用原生态的mybatis操作数据,原生态的没什么不好,只不过国内有个tk.mybatis的工具帮助我们做了很多实用的事情,大多数情况下我们需要在原生态mybatis上加工的想法它基本上都已经有很好的实现,这篇将分享安装postgresql,配置tk.mybatis的详细步骤以及在这过程中可能遇到的一些小问题. 安装postgresql,执行下面的命令就可以安装了: 复制代码 代码如下: ap

  • PostgreSQL 角色与用户管理介绍

    一.角色与用户的区别 角色就相当于岗位:角色可以是经理,助理.用户就是具体的人:比如陈XX经理,朱XX助理,王XX助理.在PostgreSQL 里没有区分用户和角色的概念,"CREATE USER" 为 "CREATE ROLE" 的别名,这两个命令几乎是完全相同的,唯一的区别是"CREATE USER" 命令创建的用户默认带有LOGIN属性,而"CREATE ROLE" 命令创建的用户默认不带LOGIN属性(CREATE U

  • Windows PostgreSQL 安装图文教程

    它提供了多版本并行控制,支持几乎所有 SQL 构件(包括子查询,事务和用户定义类型和函数), 并且可以获得非常广阔范围的(开发)语言绑定 (包括 C,C++,Java,perl,tcl,和 python).本文介绍的是其在windows系统下的安装过程. 一般说来,一个现代的与 Unix 兼容的平台应该就能运行 PostgreSQL.而如果在windows系统下安装,你需要 Cygwin 和cygipc 包.另外,如果要制作服务器端编程语言 PL/Perl,则还需要完整的Perl安装,包括 li

  • Linux CentOS 7安装PostgreSQL9.3图文教程

    如题,本篇blog记录一下在Linux CentOS 7中安装PostgresSQL的整个过程以及数据库配置等,在Linux系统中,PostgreSQL的安装方式分两种,分别是: 1.二进制安装包安装 2.源码编译安装 由于我们没有什么特殊需求所在在此选择较为简单的方式--二进制安装包安装,二进制包安装的方法一般都是通过不同发行版本的Linux下的包管理器进行的,例如Debian和Ubuntu下是使用apt-get命令或aptitude命令来安装,命令如下: sudo apt-get insta

  • 举例简单介绍PostgreSQL中的数组

    PostgreSQL 有很多丰富的开箱即用的数据类型,从标准的数字数据类型.到几何类型,甚至网络数据类型等等.虽然很多人会忽略这些数据类 型,但却是我最喜欢的特性之一.而数组数据类型正如你所期望的,可以在 PostgreSQL 存储数组数据,有了这个特性,你可以在单个表中实现以往需要多个表才能实现的存储要求. 为什么要使用数组来存储数据,如果你是应用开发人员,那么在数据库中使用同样的模型来存储程序中的数据,何乐而不为呢.况且这样的做法还能提升性能.下面我们将介绍如何使用 PostgreSQL 的

  • Linux CentOS 7源码编译安装PostgreSQL9.5

    之前的博客记录了通过rpm包的形式安装PostgreSQL 9.3(Linux CentOS 7 安装PostgreSQL 9.3(发行版本) ),本篇blog将记录一下通过源码编译的形式安装PostgreSQL 9.5. 下载 在postgresql的官方即可找到源码文件目录,地址如下:https://www.postgresql.org/ftp/source/,在下载列表中根据需求选择版本,如下图: 进入子目录后,可以看到文件列表: 如上图,可以看到提供了两种压缩格式,此处我们选择postg

  • 在PostgreSQL中使用数组时值得注意的一些地方

    在Heap中,我们依靠PostgreSQL支撑大多数后端繁重的任务,我们存储每个事件为一个hstore blob,我们为每个跟踪的用户维护一个已完成事件的PostgreSQL数组,并将这些事件按时间排序. Hstore能够让我们以灵活的方式附加属性到事件中,而且事件数组赋予了我们强大的性能,特别是对于漏斗查询,在这些查询中我们计算不同转化渠道步骤间的输出. 在这篇文章中,我们看看那些意外接受大量输入的PostgreSQL函数,然后以高效,惯用的方式重写它. 你的第一反应可能是将PostgreSQ

  • PHP 读取Postgresql中的数组

    复制代码 代码如下: function getarray_postgresql($arraystr) {     $regx1 = '/^{(.*)}$/';     $regx2 = "/\"((\\\\\\\\|\\\\\"|[^\"])+)\"|[^,]+/";     $regx3 = '/^[^"].*$|^"(.*)"$/';     $match = null;     preg_match( $reg

  • Mybatis调用PostgreSQL存储过程实现数组入参传递

    前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于PostgreSQL自带数组类型,所以有一个自定义函数的入参就是一个int数组,形如: 复制代码 代码如下: CREATE OR REPLACE FUNCTION "public"."func_arr_update"(ids _int4)... 如上所示,参数是一个int数组,Mybatis提供了对调用存储过程的支持,那么PostgreSQL独有的数组类型作为存储过程的参数又

  • C#访问PostGreSQL数据库的方法

    我对PostGreSQL只是一知半解,记录这个过程是希望如果以后微软技术方向的人遇到类似的需求,可以有个比较直接的的参考.在不熟悉的知识领域里,总是有搜索引擎可以帮到我. 初步了解PostGreSQL数据库及数据形态 首先我想看看PostGreSQL的数据库以及我想要获取的数据形态是什么样子的,Linux和PostGreSQL这两个关键字我都不熟悉,搜了一下找到了一个可以连通PostGreSQL数据库的Windows客户端,叫pgAdmin,我装的是III版本,应该是比较新的,下载安装后看到界面

随机推荐