Skip to content

Flex Attributes is a Rails plugin that allows you to define an arbitrary amount of data to be stored in a serialized column.

License

Notifications You must be signed in to change notification settings

kylecrum/flex_fields

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Flex Fields

Flex Fields allows you to define an arbitrary amount of data to be stored in a serialized column. Why? Because sometimes you have data that just doesn't need to be in its own column.

Installation

You should have a column in your database in order to store the serialized data. Make the column name "flex" for it to work out of the box.

class AddFlexFieldsColumn < ActiveRecord::Migration
  def change
    add_column :some_table, :flex, :text
  end
end

Examples

To activate, just need to declare flex_fields in your model.

	class MyModel < ActiveRecord::Base
		flex_fields :foo=>String, :bar=>Integer
	end

This gives you two new flex fields: foo and bar

	my_model = MyModel.new(:foo=>'foo',:bar=>1)
	my_model.foo
		=> 'foo'
	my_model.bar
		=> 1

Flex Fields works nicely with inheritance and STI, too, so don't worry about that!

	class AnotherModel < MyModel
		flex_fields :more_stuff=>Array
	end
	
	another_model = AnotherModel.new
	another_model.foo
		=> nil
	another_model.more_stuff
		=> []

By default, the data is stored in a serialized Hash in a column called 'flex' You can change this by passing in column_name.

	class MyModel < ActiveRecord::Base
		flex_fields :column_name=>:data, :foo=>String, :bar=>Integer
	end

Now, everything is stored in a serialized hash in the data column.

Just like in ActiveRecord, if you want to override the default getter and setter methods, you can. Instead of using write_attribute and read_attribute, use write_flex_field and read_flex_field

	class MyModel < ActiveRecord::Base
	
		flex_fields :foo=>String, :bar=>Integer
		
		def foo
			logger.debug("I am accessing foo")
			read_flex_field(:foo)
		end
		
		def foo=(new_val)
			logger.debug("I am setting foo to a new value")
			write_flex_field(:foo,new_val)
		end
	
	end

Conversions

Flex Attributes will convert the value to the class you specify in the declaration

	class MyModel < ActiveRecord::Base
		flex_fields :float_value=>Float, :integer_value=>Integer
	end
	
	model = MyModel.new
	model.float_value = '1'
	model.float_value
		=> 1.0
	model.integer_value = '1'
	model.integer_value
		=> 1

Currently, Flex Fields supports these types of fields:

Array
Date
DateTime
Float
Hash
Integer
String
Time

About

Flex Attributes is a Rails plugin that allows you to define an arbitrary amount of data to be stored in a serialized column.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages