markdown ActiveRecord属性とas_json(serializable_hash)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown ActiveRecord属性とas_json(serializable_hash)相关的知识,希望对你有一定的参考价值。
## DBに依存しないattributeの追加
```ruby
class StorageMetadatum < ApplicationRecord
validates :file_name, presence: true, length: { maximum: 64 }
validates :size, presence: true, numericality: true
attribute :human_size, :string
##
# convert human size
# @return [String]
def human_size
ActiveSupport::NumberHelper.number_to_human_size(self.size)
end
end
```
4.2以降では`attr_accessor`ではなく、`attribute`が使用可能
> attribute(name, cast_type = Type::Value.new, **options)
## hash化
- attributes
```ruby
storage_metadata = StorageMetadatum.find(1)
puts storage_metadata.attributes
=> {"id"=>1,
"created_at"=>Fri, 30 Mar 2018 09:01:59 UTC +00:00,
"updated_at"=>Fri, 30 Mar 2018 09:01:59 UTC +00:00,
"file_name"=>"README.md",
"file_type"=>nil,
"size"=>460,
"human_size"=>nil}
```
- serializable_hash
```ruby
storage_metadata.serializable_hash
=> {"id"=>1,
"created_at"=>Fri, 30 Mar 2018 09:01:59 UTC +00:00,
"updated_at"=>Fri, 30 Mar 2018 09:01:59 UTC +00:00,
"file_name"=>"README.md",
"file_type"=>nil,
"size"=>460,
"human_size"=>"460 Bytes"}
```
- as_json
```ruby
storage_metadata.as_json
=> {"id"=>1,
"created_at"=>Fri, 30 Mar 2018 09:01:59 UTC +00:00,
"updated_at"=>Fri, 30 Mar 2018 09:01:59 UTC +00:00,
"file_name"=>"README.md",
"file_type"=>nil,
"size"=>460,
"human_size"=>"460 Bytes"}
```
## Why?
- attributesはAttributeSetクラスのインスタンス生成時に設定される
https://github.com/rails/rails/blob/1a4eb55a827a8641c19e03219d881f4aaba9748b/activemodel/lib/active_model/attribute_set.rb#L11
> findやnew等のコール時にAttributeSetのコンストラクタが呼ばれる
- serializable_hashはActiveModel::Serializationモジュールのメソッド
https://github.com/rails/rails/blob/1a4eb55a827a8641c19e03219d881f4aaba9748b/activemodel/lib/active_model/serialization.rb#L126
- as_jsonはActiveModel::Serializerz::Jsonモジュールのメソッド
https://github.com/rails/rails/blob/1a4eb55a827a8641c19e03219d881f4aaba9748b/activemodel/lib/active_model/serializers/json.rb
ともに`serializable_hash`メソッド内部で該当するattributeをreadして利用している
そのため、`human_size`メソッドを内部で読んでいる
以上是关于markdown ActiveRecord属性とas_json(serializable_hash)的主要内容,如果未能解决你的问题,请参考以下文章
markdown SCSSとautoprefixerだけ使いたい时
markdown pandas.DataFrameとnumpy.ndarrayを相互変换
markdown 研究者として生きていくコツ
markdown 动作条と工具栏が両方表示される
markdown rake db:createすると访问被拒绝用户が出る
markdown 服务を通知とともに开始したときの通知を更新する