项目作者: Liooo

项目描述 :
DYNAmic attriBUTEs for ActiveRecord
高级语言: Ruby
项目地址: git://github.com/Liooo/dynabute.git
创建时间: 2017-08-22T17:22:50Z
项目社区:https://github.com/Liooo/dynabute

开源协议:MIT License

下载


Dynabute

Dynamically add attributes on Relational Database backed ActiveRecord, without hash serialization and bullshits.

Try messing with a working demo.

Usage

First, enable dynabute

  1. class User < ActiveRecord::Base
  2. has_dynabutes
  3. end
  4. `

then add some field definitions

  1. User.dynabutes.create( name: 'age', value_type: 'integer' )
  2. User.dynabutes.create( name: 'skinny', value_type: 'boolean' )
  3. User.dynabutes.create( name: 'personalities', value_type: 'string', has_many: true )

now set value

  1. user = User.create
  2. user.set_dynabute_value( name: 'age', value: 35 ).save
  3. # => true

check the value

  1. user.dynabute_value( name: 'age' ).value
  2. # => 35

values can also be referenced by dynabute_<field name>_value(s)

  1. user.dynabute_age_value.value
  2. # => 35

nested attributes of glory

  1. personality_field_id = User.dynabutes.find_by( name: 'personalities' ).id
  2. user.update(
  3. dynabute_values_attributes: [
  4. { name: 'age', value: 36 }, #=> tell us which field to update by `name:`
  5. { name: 'skinny', value: false },
  6. { field_id: personality_field_id, value: 'introverted' }, # or by `field_id:`
  7. { field_id: personality_field_id, value: 'stingy' }
  8. ]
  9. )

select value_type is also available

  1. User.dynabutes.create( name: 'gender', value_type: 'select', options_attributes: [ { label: 'male' }, { label: 'female' } ] )
  2. User.dynabutes.create( name: 'hobbies', has_many: true, value_type: 'select', options_attributes: [ { label: 'running' }, { label: 'swimming' }, { label: 'hiking' } ] )

list the available options for a field

  1. User.dynabutes.find_by(name: gender).options
  2. # => [#<Dynabute::Option:0x007ff53e2e1f90 id: 1, field_id: 4, label: "male">,
  3. # #<Dynabute::Option:0x007ff53e2e1568 id: 2, field_id: 4, label: "female">]

set value

  1. male = User.dynabutes.find_by(name: 'gender').options.find_by(label: 'male')
  2. hobbies = User.dynabutes.find_by(name: 'hobbies').options
  3. user.update(dynabute_values_attributes: [
  4. { name: 'gender', value: male.id },
  5. { name: 'hobbies', value: hobbies[0].id },
  6. { name: 'hobbies', value: hobbies[1].id }
  7. ])

check out the selected options

  1. user.dynabute_value(name: 'gender').option
  2. # => <Dynabute::Option:0x007ff53e2e1f90 id: 1, field_id: 4, label: "male">,
  3. user.dynabute_value(name: 'hobbies').map(&:option)
  4. # => [#<Dynabute::Option:0x007fb26c4467d8 id: 5, field_id: 5, label: "running">,
  5. # #<Dynabute::Option:0x007fb26c446238 id: 6, field_id: 5, label: "swimming">]

remove value

  1. user.remove_dynabute_value(name: 'age')
  2. # => #<Dynabute::Values::StringValue:0x0000 ... dynabutable_type: "User", value: 35>

Installation

Add this line to your application’s Gemfile:

  1. gem 'dynabute'

And then execute:

  1. $ bundle install
  2. $ rails generate dynabute:install
  3. $ rake db:migrate

Contributors


CrAsH1101

Contributing

Rspec: set test environment

  1. $ bundle install
  2. $ cd spec/dummy/
  3. $ RAILS_ENV=test bundle exec rake db:create
  4. $ RAILS_ENV=test bundle exec rake db:migrate
  5. $ cd ../../
  6. $ bundle exec rspec

License

The gem is available as open source under the terms of the MIT License.