项目地址:
https://github.com/SuMingXuan/hash_map_attributes/
写这个插件是因为目前在我做写业务的时候,需要预留一个 json 字段方便以后数据的扩展,并且方便 CRUD
。比如我有一个 pages
表包含了一个 jsonb
类型的字段(extra_data),extra_data
里面可能存很多额外的属性或者是目前我们没有考虑到的属性。让我痛苦的是,对这种类型的字段操作 CRUD
会让代码变得非常难看。
class Page < ApplicationRecord
# == Schema Information
#
# Table name: special_channels
#
# id :bigint not null, primary key
# description :string
# title :string
# extra_data :jsonb
# created_at :datetime not null
# updated_at :datetime not null
include HashMapAttributes
hash_map_attributes :image_url, to: :extra_data
hash_map_attributes :background_url, prefix: :content, to: :extra_data
end
page = Page.new(image_url: 'http://www.image.com/example1.png', content_background_url: 'http://www.image.com/example2.png')
page.save
page.image_url #=> http://www.image.com/example1.png
page.content_background_url #=> http://www.image.com/example2.png
page.update(image_url: ' http://www.image.com/example3.png')
page.image_url #=> http://www.image.com/example3.png
如果是 jsonb 的话,那么则支持查询
Page.where_hash(image_url: 'http://www.baidu.com', content_background_url: 'http://www.baklib.com')
控制台会打印如下查询语句
SELECT "pages".* FROM "pages" WHERE (pages.extra_data->>'image_url' = 'http://www.baidu.com' and pages.extra_data->>'background_url' = 'http://www.baklib.com')
补充:现在支持嵌套 json 的查询和修改了,但是取消了指定前缀的参数。