環境
- 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でそれぞれ用意されているメソッドになります。