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 服务を通知とともに开始したときの通知を更新する