= Property sets This gem is a way for you to use a basic "key/value" store for storing attributes for a given model in a relational fashion where there's a row per attribute. Alternatively you'd need to add a new column per attribute to your main table, or serialize the attributes and their values. == Description You configure the allowed stored properties by specifying these in the model: class Account < ActiveRecord::Base property_set :settings do property :version, :default => "v1.0" property :featured, :protected => true property :activated end property_set :texts do property :epilogue end end The declared properties can then be accessed runtime via the defined association: # Return the value of the version record for this account, or the default value if not set account.settings.version # Update the version record with given value account.settings.version = "v1.1" # Query the truth value of the property account.settings.featured? # Short hand for setting one or more values account.settings.set(:version => "v1.2", :activated => true) === Bulk operations Stored properties can also be updated with the update_attributes and update_attributes! methods by enabling nested attributes. Like this (from the test cases): @account.texts_attributes = [ { :name => "foo", :value => "1" }, { :name => "bar", :value => "0" } ] And for existing records: @account.update_attributes!(:texts_attributes => [ { :id => @account.texts.foo.id, :name => "foo", :value => "0" }, { :id => @account.texts.bar.id, :name => "bar", :value => "1" } ]) Using nested attributes is subject to implementing your own security measures for mass update assignments. Alternatively, it is possible to use a custom hash structure: params = { :settings => { :version => "v4.0", :featured => "1" }, :texts => { :epilogue => "Wibble wobble" } } @account.update_attributes(params) The above will not update +featured+ as this has the protected flag set and is hence protected from mass updates. === View helpers We support a couple of convenience mechanisms for building forms and putting the values into the above hash structure. So far, only support check boxes and radio buttons: <% form_for(:account, :html => { :method => :put }) do |f| %>

<%= f.property_set(:settings).check_box :activated %> Activated?

<%= f.property_set(:settings).radio_button :hot, "yes" %> Hot

<%= f.property_set(:settings).radio_button :not, "no" %> Not

<% end %> == Installation Install the gem in your rails project by putting it in your Gemfile: gem "property_sets" Also remember to create the storage table(s), if for example you are going to be using this with an accounts model and a "settings" property set, you can define the table like: create_table :account_settings do |t| t.integer :account_id, :null => false t.string :name, :null => false t.string :value t.timestamps end add_index :account_settings, [ :account_id, :name ], :unique => true == Requirements * ActiveRecord * ActiveSupport == LICENSE: (The MIT License) Copyright (c) 2011 Zendesk Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.