最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單介紹Ruby on Rails對(duì)PostgreSQL數(shù)組類(lèi)型的支持

 更新時(shí)間:2015年04月21日 10:48:50   投稿:goldensun  
這篇文章主要介紹了簡(jiǎn)單介紹Ruby on Rails對(duì)PostgreSQL數(shù)組類(lèi)型的支持,Rails框架從4.0以后對(duì)PG的數(shù)組提供了支持,需要的朋友可以參考下

 我非常高興在宣布Rails 4.0 現(xiàn)在支持 PostgreSQL 數(shù)組類(lèi)型. 你可以方便的在migration通過(guò) :array => true里創(chuàng)建數(shù)組類(lèi)型的字段. 創(chuàng)建數(shù)組類(lèi)型的字段的時(shí)候還可以添加其它的選項(xiàng)(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

需要注意在是對(duì)數(shù)組類(lèi)型的字段設(shè)置默認(rèn)值的時(shí)候,你應(yīng)該用Postgresql里的寫(xiě)法({value,another value}), 如果你想設(shè)置數(shù)組類(lèi)型的字段默認(rèn)值為空數(shù)組的時(shí)候,你應(yīng)該使用: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數(shù)組的例子

我們現(xiàn)在有個(gè)包含first_name, last_name, nickname的user model, 其中nickname字段是數(shù)組類(lèi)型. 下面的migration代碼會(huì)創(chuàng)建相應(yīng)的表:
 

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

并且對(duì)于這個(gè)表,我們有個(gè)簡(jiǎn)單的model
 

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

我們沒(méi)有對(duì)字段使用默認(rèn)值,如果我們實(shí)例一個(gè)User 對(duì)象,代碼是這樣的.
 

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

如果,我們調(diào)用john.nickname, 結(jié)果會(huì)返回nil, 并且在postgreSQL 里存儲(chǔ)的是NULL值.

我們通過(guò)下面的代碼可以在創(chuàng)建時(shí),設(shè)置nickname屬性值 
 

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

如果我們從數(shù)據(jù)庫(kù)獲取記錄,那么nick_name字段會(huì)轉(zhuǎn)變成一個(gè)數(shù)組,而不是返回字符串{Jack, Johnny}!。Rails 4.0擁有一個(gè)純Ruby數(shù)組轉(zhuǎn)換器,但是如果你想讓轉(zhuǎn)換過(guò)程加速,那么就可以使用之前提到的 pg_array_parser gem。PgArrayParser 擁有一個(gè)基于C的擴(kuò)展,還有一個(gè)JRuby的Java的實(shí)現(xiàn)(即使這個(gè)gem現(xiàn)在在JRuby上存在些問(wèn)題,我正在嘗試去解決這個(gè)問(wèn)題。)

有一個(gè)重點(diǎn)需要注意的,就是當(dāng)在一個(gè)model中和數(shù)組(或者其他可變數(shù)值)交互的時(shí)候。ActiveRecord現(xiàn)在并沒(méi)有跟蹤"destructive",或者更改發(fā)生的地方。這包括數(shù)組的push和pop操作。如果你需要使用"destructive"更新,你必須使用call<屬性>_will_change!這樣可以讓ActiveRecord知道你需要更改屬性的值。對(duì)于我們的這個(gè)User model,如果你想在nickname后面追加元素,你可以這樣做:
 

john = User.first
 
john.nicknames += ['Jackie boy']
# 或者
john.nicknames = john.nicknames.push('Jackie boy')
# 任何時(shí)候,屬性通過(guò)"="賦值,ActiveRecord會(huì)跟蹤這個(gè)更改
john.save
 
john.reload
john.nicknames
#=> ['Jack', 'Johnny', 'Jackie Boy']
 
john.nicknames.pop
john.nicknames_will_change!
# '#pop'操作會(huì)改變數(shù)組的值,所以我們需要告訴ActiveRecord它將會(huì)發(fā)生更改
john.save

 

最后一項(xiàng)在Postgresql中使用數(shù)組要注意的事情是: 數(shù)組沒(méi)有元素?cái)?shù)量限制,可以是多維數(shù)組,但是在使用多維數(shù)組時(shí), 子數(shù)組元素個(gè)數(shù)必須是一樣的.

 

[[1,2,3], [2,3,4], [4,5,nil]]
# 在PostgreSQL 可用,每個(gè)子數(shù)組元素個(gè)數(shù)一樣
 
[1,2,[3,4]]
# 不可用的數(shù)組

相關(guān)文章

最新評(píng)論

晋宁县| 蛟河市| 十堰市| 新蔡县| 嘉鱼县| 西盟| 瑞安市| 古交市| 格尔木市| 清徐县| 永春县| 莆田市| 阿坝县| 吴堡县| 游戏| 秦皇岛市| 荆门市| 龙里县| 年辖:市辖区| 浠水县| 衡水市| 肥东县| 吉木萨尔县| 临澧县| 徐闻县| 平凉市| 华坪县| 洛隆县| 东方市| 常宁市| 安阳县| 嘉兴市| 运城市| 上思县| 广丰县| 曲麻莱县| 曲阳县| 江川县| 原平市| 介休市| 兰考县|