ActiveRecord::ConnectionAdapters::TableDefinition | column相关方法学习笔记

TableDefinition 的对象,就是我们在写 migrate 的时候使用的对象 t

如下

class SomeMigration < ActiveRecord::Migration
  def up
    create_table :foo do |t|
      puts t.class  # => "ActiveRecord::ConnectionAdapters::TableDefinition"
    end
  end

  def down
    ...
  end
end

column 方法语法是:
column (name, type, options = {})
type 可以是
:primary_key
:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean
你也可以不使用上面的类型,比如使用 MySQL 里的 polygon 类型,但是我们应该避免使用这些,这样我们的数据库模型才能兼容多种数据库.

可用的 options 是下面的这几种:
:limit 给定一个最大长度, 一般给 :string 和 :text 指定, 或者是指定给 :binary 表示二进制数据的字节数, 而给定 :integer 则表示允许的位数。

:default 指定字段的默认值,使用nil 来表示NULL
:null 是否允许字段为NULL ,也可以用 :null_allowed 来指定这一项。
:precision 为 :decimal 字段指定有效位的数量( 不包含小数点等)
:scale 为 :decimal 指定允许小数点后面有几位.

我们假定 t 为 TableDefinition 的实例。

t.column(:granted, :boolean)
# granted BOOLEAN

t.column(:picture, :binary, limit: 2.megabytes)
# => picture BLOB(2097152)

t.column(:sales_stage, :string, limit: 20, default: ‘new‘ , null: false)
# => sales_stage VARCHAR(20) DEFAULT ‘new‘ NOT NULL

t.column(:bill_gates_money, :decimal, precision: 15, scale: 2)
# => bill_gates_money DECIMAL(15,2)

t.column(:sensor_reading, :decimal, precision: 30, scale: 20)
# => sensor_reading DECIMAL(30,20)

# 在大多数数据库中,:scale 一般为 0 ,我们可以不指定它
t.column(:huge_integer, :decimal, precision: 30)
# => huge_integer DECIMAL(30)

# 指定某种数据库特有的类型
t.column(:foo, ‘polygon‘)
# => foo polygon

一般地,像下面这种定义,我们可以使用类型方法简化它

create_table :products do |t|
  t.column :shop_id,    :integer
  t.column :creator_id, :integer
  t.column :name,       :string, default: "Untitled"
  t.column :value,      :string, default: "Untitled"
  t.column :created_at, :datetime
  t.column :updated_at, :datetime
end

我们可以使用更简便的方式来完成上面代码的工作:

create_table :products do |t|
  t.integer :shop_id, :creator_id
  t.string :name, :value, default: "Untitled"
  t.timestamps
end

references方法 将添加字段并用后缀命名为 xxx_id , 如果指定了 :polymorphic 项, 会增加一个 xxx_type 字段。如果:polymorphic 的值为 hash 类型,当你想创建 xxx_type 字段是,就会很有用。 也可以指定 :index 来添加索引, 就象使用 add_index 方法一样。具体如下:

create_table :taggings do |t|
  t.integer :tag_id, :tagger_id, :taggable_id
  t.string :tagger_type
  t.string :taggable_type, default: ‘Photo‘
end
add_index :taggings, :tag_id, name: ‘index_taggings_on_tag_id‘
add_index :taggings, [:tagging_id, :tagger_type]

使用下面代码也能完成上面的操作

create_table :taggings do |t|
  t.references :tag, index: {name: ‘index_taggings_on_tag_id‘}
  t.references :tagger, polymorphic: true, index: true
  t.references :taggable, polymorphic: {default: ‘Photo‘ }
end
时间: 2024-07-29 07:08:12

ActiveRecord::ConnectionAdapters::TableDefinition | column相关方法学习笔记的相关文章

Castle ActiveRecord学习笔记三:初始化配置

在使用Castle ActiveRecord的时候,需要两种方式来进行初始化,一种就是通过配置文件,另外一种就是将初始配置进行硬编码,写到程序中来. 当然,一般来说,利用配置文件来进行将会大大简化后期维护,我们首先在程序中添加一个App.config的配置文件,记住,一定要将这个配置文件的生成操作设置为"嵌入的资源"才行.否则会提示如学习笔记二中所出现的问题. 具体的配置如下: <?xml version="1.0" encoding="utf-8&

[原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

Android学习笔记(十八)——再谈升级数据库

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 之前我们为了保证数据库中的表是最新的,只是简单地在 onUpgrade()方法中删除掉了当前所有的表,然后强制重新执行了一遍 onCreate()方法.这种方式在产品的开发阶段确实可以用,但是当产品真正上线了之后就绝对不行了.想象以下场景,比如你编写的某个应用已经成功上线,并且还拥有了不错的下载量.现在由于添加新功能的原因,使得数据库也需要一起升级,然后用户更新了这个版本之后发现以前程序中存储的本地数据全部丢失了.

OpenCV(C++接口)学习笔记2-像素级的图像操作

1.通过成员函数at(int y, int x)访问 这种方法需要知道像素保存的格式. (1) 这是为模板类型的函数,因为一个函数的返回类型只有在运行时才会知道. (2)这个函数返回的是一个向量即Vector,故有下标的操作. image.at<uchar>(j,i)= 255; 在单通道图像中,采用以上语句可以获取图像(i,j)处的灰度值(注:先行后列,一般用j表示行(rows),i表示列(cols)).如果是灰度图像的话,只需要更改一个数据就可以了.如果是rgb图像的话,就要用"

jQuery学习笔记--JqGrid相关操作 方法列表(上)

1.获得当前列表行数:$("#gridid").getGridParam("reccount"); 2.获取选中行数据(json):$("#gridid").jqGrid('getRowData', id); 3.刷新列表:$(refreshSelector).jqGrid('setGridParam', { url: ''), postData: ''}).trigger('reloadGrid'); 4.选中行:$("#jqGrid

《R语言实战》学习笔记seventh

由于在准备软考中级数据库系统工程师外加巩固SQL Server 2012,所以拖了好久一直没继续学R 下去 所以今天重开R 的战事 这次是关于基本统计分析的内容,即关于用于生成基本的描述性统计量和推断统计量的R 函数 首先,将着眼于定量变量的位置和尺度的衡量方式 然后将是生成类别型变量的频数表和列联表的方法(以及连带的卡方检验) 接下来将考察连续型和有序型变量相关系数的多种形式 最后转而通过参数检验(t检验)和非参数检验(Mann-Whitney U检验.Kruskal-Wallis检验)方法研

CLR_VIA_C# 学习笔记(1)

Perface 如果让你实现这个页面和一些操作的,比如点击1.2.3等就在那个input text中显示,还有删除功能,拨打我们先不要管它,只是模拟而已.要是我刚开始做的话,我会这样做: 用css.HTML布局那个界面 用javascript的事件委托监听那个按钮的父节点的点击事件 但是如果我想用面向对象的思想做呢?我是用Ext做的,所以我想说的是它帮我封装了很多.可能一些没用过Ext的人不太了解我下面贴的代码,但是我会尽量解释清楚的! Description ContactTelPanel =