- 更新日: 2015年7月1日
- Rails
Railsマイグレーションでdecimal型の精度(桁数)を指定
Rails のマイグレーションで、カラムに decimal 型を桁数(精度)とともに指定する方法です。Rails プロジェクトで、地図を用いた機能で緯度・経度の座標を扱う機会があったのですが、座標データということで整数部3桁・小数点以下8桁(合計11桁)の小数の数値データをカラムに格納したかった。
Railsで座標を扱うときに嵌ったのでメモ – @Konboi memo
マイグレーション(migration) – – Railsドキュメント
上記ページあたりを参考にしました。
— 環境 —
rails 4.1.6
activerecord 4.1.6
decimal 型指定では precision, scale のオプションを指定可
migration で decimal のデータ型を指定する場合、「precision – 全体の桁数(精度)」と「scale – 小数点以下の桁数」のオプションを指定できる。以下の例では、geocodes テーブルとそのカラム latitude, longitude などを作成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class CreateGeocodes < ActiveRecord::Migration def self.up create_table :geocodes do |t| t.string :address, null: false, default: "" t.decimal :latitude, precision: 11, scale: 8 t.decimal :longitude, precision: 11, scale: 8 end add_index :geocodes, :address, unique: true end def self.down drop_table :geocodes end end |
latitude(緯度)、longitude(経度)のカラムに decimal 型を指定して、全体の精度(桁数)が 11(precision)、小数点以下の桁数が 8(scale)となるように指定しました。
BigDecimal オブジェクトが返されることへの対応
冒頭のリンク先にも書いてありますけど、decimal 型を指定してマイグレーションを行った場合、モデルの属性へのアクセスで BigDecimal のオブジェクトが返ってきます。上記マイグレーションの例ですと、Geocode#latitude, Geocode#longitude が BigDecimal のオブジェクトを返す。
なので、モデルに reader 用のメソッドを作成しておくと便利かと思います。Ruby の Float オブジェクトの数値としての表示や引数の値として渡す場合などは、これを使うようにすると便利かと。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Geocode < ActiveRecord::Base # ... def lat latitude.to_f end def lng longitude.to_f end # ... end |
以上です。
- – 参考リンク –
- Rails マイグレーションのフィールド定義データ型と MySQL・Ruby との対応表 | EasyRamble
- Railsのmigrationで緯度経度をdecimalで設定する – リア充爆発日記
- MySQLで6桁までの小数点を丸めずに扱うならFLOAT型を使うべき理由 – Qiita
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!