Rails 4: List of available datatypes
Asked Answered
K

5

440

Where can I find a list of data types that can be used in Ruby on Rails 4? Such as

  • text
  • string
  • integer
  • float
  • date

I keep learning about new ones and I'd love to have a list I could easily refer to.

Kondon answered 29/7, 2013 at 7:19 Comment(4)
possible duplicate of Where is the documentation page for ActiveRecord data types?Golgotha
@MarkThomas: Not a duplicate. My question here is specifically for Rails 4.Kondon
The accepted answer in that question is essentially the same as your accepted answer. Both point to the Rails 4 docs. Also, it's a moot point because ActiveRecord datatypes didn't change from Rails 3 to Rails 4.Golgotha
I for one did not know AR datatypes didn't change between rails 3 and 4 so I'm thankful this question/answer is here.Expertize
K
727

Here are all the Rails 4 (ActiveRecord migration) datatypes:

  • :binary
  • :boolean
  • :date
  • :datetime
  • :decimal
  • :float
  • :integer
  • :bigint
  • :primary_key
  • :references
  • :string
  • :text
  • :time
  • :timestamp

Source: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_column
These are the same as with Rails 3.

If you use PostgreSQL, you can also take advantage of these:

  • :hstore
  • :json
  • :jsonb
  • :array
  • :cidr_address
  • :ip_address
  • :mac_address

They are stored as strings if you run your app with a not-PostgreSQL database.

More PostgreSQL data types

Kondon answered 29/7, 2013 at 7:19 Comment(7)
I believe these are the datatypes that are supported across all databases. However as Peter de Ridder mentions there are some datatypes like hstore which are still supported.Diamine
Question: postgres documentation doesn't seem to have text data type. Yet, rails can still handle it? What goes on in the background?Weeks
PostgreSQL does have a text datatype. Under the hood all varchar/text fields are variable length arrays. postgresql.org/docs/9.3/interactive/datatype-character.htmlGibb
I'd like to add that if you're using a non-postgres database and your application schema_format is not set to use :sql, then your schema.rb file wont be able to dump the table that uses types like :json. The schema will still be dumped for the tables that use default types but you'll see a comment for the table with special types like, "could not dump table...". Look here to set the schema_format.Pukka
Also, those columns will have type nil in a non-postgres database. You can inspect the type in the console with Model.columns_hash["column_name"].type. These are just things that I've run into when using :json column type, I may be wrong and this may not happen to everyone but I thought I'd let future readers know in case they have troubles. Regardless, +1 for this answer because it really helped me.Pukka
I would also like to add :jsonb. Difference is here: "The json data type stores an exact copy of the input text, which processing functions must reparse on each execution; while jsonb data is stored in a decomposed binary format that makes it slightly slower to input due to added conversion overhead, but significantly faster to process, since no reparsing is needed. jsonb also supports indexing, which can be a significant advantage." postgresql.org/docs/9.4/static/datatype-json.htmlWestern
Rails 4 also has a :bigint typeToast
P
268

You might also find it useful to know generally what these data types are used for:

There's also references used to create associations. But, I'm not sure this is an actual data type.

New Rails 4 datatypes available in PostgreSQL:

  • :hstore - storing key/value pairs within a single value (learn more about this new data type)
  • :array - an arrangement of numbers or strings in a particular row (learn more about it and see examples)
  • :cidr_address - used for IPv4 or IPv6 host addresses
  • :inet_address - used for IPv4 or IPv6 host addresses, same as cidr_address but it also accepts values with nonzero bits to the right of the netmask
  • :mac_address - used for MAC host addresses

Learn more about the address datatypes here and here.

Also, here's the official guide on migrations: http://edgeguides.rubyonrails.org/migrations.html

Parted answered 29/3, 2014 at 1:19 Comment(6)
Applause. +1 for thoroughness, and anticipation of usage. That's UX mentality right there.Weeks
Absolutely terrific answer - many thanks for this. The links to the articles on differences literally took the questions right out of my mouth.Agra
For Postgres there is additionally a uuid type which can be used as normal field like t.uuid :name... or as primary key like create_table :users, id: :uuid do... or e.g. t.primary_key :id, :uuid, :default => 'uuid_generate_v1()'Excrescent
Additional PostgreSQL types supported by Rails listed in the API docs for ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods. Highlights include money, json, xml, daterangeMatthieu
Yes, uuid was added for Postgres, but it is not returned with an Active Record create(). Has that issue been fixed with Rails 5?Grimaldo
It's not "inet_address", (now?), but "inet" in rails5.Topographer
P
167

It is important to know not only the types but the mapping of these types to the database types, too:

enter image description here

enter image description here


Source added - Agile Web Development with Rails 4

Pyrosis answered 6/9, 2014 at 17:2 Comment(4)
I would be interested to see the json type in this table, if you feel up to itSemifinal
You can always check the NATIVE_DATABASE_TYPES for the adapter you need - github.com/rails/rails/blob/master/activerecord/lib/…Pyrosis
Is there a spot on the guides or a single source of truth for these things over time?Edmundedmunda
date and datetime are mapped to date for oracle database. How does active record determine to which data type it should map when fetching?Empirical
T
89

You can access this list everytime you want (even if you don't have Internet access) through:

rails generate model -h
Touristy answered 8/5, 2015 at 20:56 Comment(1)
at 'Available field types:' sectionSyndicalism
A
5

Rails4 has some added datatypes for Postgres.

For example, railscast #400 names two of them:

Rails 4 has support for native datatypes in Postgres and we’ll show two of these here, although a lot more are supported: array and hstore. We can store arrays in a string-type column and specify the type for hstore.

Besides, you can also use cidr, inet and macaddr. For more information:

https://blog.engineyard.com/2013/new-in-rails-4

Acidulant answered 29/7, 2013 at 7:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.