LoginSignup
8
9

More than 5 years have passed since last update.

ActiveRecordで取得したオブジェクトをハッシュに変換し、値がnullになっているキーを除外する

Last updated at Posted at 2015-02-28

環境


  • ruby: 2.1.5
  • DB: sqlite3.6.20
  • Sinatra: 1.4.5

データベース


以下のように1つひとつのフィールドのどこにnullが入っているかわからない場合、
クエリでnull以外を取得しないようにしようと試みましたが、失敗に終わりました。
(もしもっと簡単にできる方法があれば教えて下さい・・・)

そこで、一度Hashとして受け取り、値がnullのkeyとvalueを削除し、jsonにして返すように方針を変えました。
id col1 col2 col3 col...
1 null hoge hogehoge null
2 hoge hogehoge null hogehogehoge
3 hoge null hogehoeg hogehogehoge
4 null hoge hogehoeg null

コード


/:id にアクセスし、該当するレコード1列の値が入っているもののみを返すことにします。
まずはルーティングから。モデル名はUserとします。
main.rb
get '/:id' do
  #findでidからレコードを取り出してjsonに
  user = User.find(params[:id]).to_json
  #jsonをハッシュにしてnullを除去
  hash = JSON.parse(user).compact!
  content_type :json , :charset 'utf-8'
  hash.to_json
end

続いて、上で呼び出したcompact!を書き加えます。

main.rb
class Hash
  def compact!
    delete_if{ |key, val| val.nil? }
  end
end

以上で、null以外が入ったレコードの取り出しができます。

追記: Rails(ActiveSupportが使える環境)の場合



@k-shogo さんがコメントで指摘してくれたように、Railsだと以下のように書くことができます。
get '/:id' do
  user = User.find(params[:id])
  hash = user.attributes.compact
  content_type :json , :charset 'utf-8'
  hash.to_json
end

厳密に言うと、attributesメソッドはActiveRecordで、compactはActiveSupportでそれぞれ用意されているメソッドになります。

8
9
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9