Readme.md in enumerations-1.3.2 vs Readme.md in enumerations-2.0.0

- old
+ new

@@ -1,12 +1,15 @@ Enumerations ============ +[![Gem Version](https://badge.fury.io/rb/enumerations.svg)](https://badge.fury.io/rb/enumerations) +[![Code Climate](https://codeclimate.com/github/infinum/enumerations/badges/gpa.svg)](https://codeclimate.com/github/infinum/enumerations) +[![Build Status](https://semaphoreci.com/api/v1/infinum/enumerations/branches/master/shields_badge.svg)](https://semaphoreci.com/infinum/enumerations) +[![Test Coverage](https://codeclimate.com/github/infinum/enumerations/badges/coverage.svg)](https://codeclimate.com/github/infinum/enumerations/coverage) + Rails plugin for enumerations in ActiveRecord models. -[![Build Status](https://travis-ci.org/infinum/enumerations.svg?branch=master)](https://travis-ci.org/infinum/enumerations) - Installation ============ Inside your `Gemfile` add the following: @@ -15,24 +18,26 @@ ``` Usage ===== +## Defining enumerations + Create a model for your enumerations: ```ruby -class Status < Enumeration::Base +class Status < Enumerations::Base values draft: { id: 1, name: 'Draft' }, review_pending: { id: 2, name: 'Review pending' }, published: { id: 3, name: 'Published' } end ``` Or you can use `value` method for defining your enumerations: ```ruby -class Status < Enumeration::Base +class Status < Enumerations::Base value :draft, id: 1, name: 'Draft' value :review_pending, id: 2, name: 'Review pending' value :published, id: 3, name: 'Published' end ``` @@ -44,21 +49,26 @@ enumeration :status validates :status_id, presence: true end ``` -You can pass attributes to specify which enumeratior and which column to use: +You can pass attributes to specify which enumeration and which column to use: ```ruby class Post < ActiveRecord::Base enumeration :status, - foreign_key: :post_status_id, # specifies which column to use - class_name: Post::Status # specifies the class of the enumerator + foreign_key: :post_status_id, # specifies which column to use + class_name: Post::Status # specifies the class of the enumerator validates :post_status_id, presence: true end ``` +Attribute `foreign_key` you can pass as a `String` or a `Symbol`. Attribute `class_name` can be set as a `String`, a `Symbol` or a `String`. + + +## Setting enumeration value to objects + Set enumerations, find enumerations by `symbol`: ```ruby @post = Post.first @post.status = Status.find(:draft) @@ -69,32 +79,105 @@ ```ruby @post.status = Status.draft ``` +Also, you can set enumeration value like this: + +```ruby +@post.status_draft! +``` + +> When you include enumerations into your model, you'll get methods for setting each enumeration value. Each method name is consists from enumeration name and enumeration value name with **!** at the end. Examples: + +```ruby +class Post < ActiveRecord::Base + enumeration :status +end + +@post.status_draft! +``` + +```ruby +class User < ActiveRecord::Base + enumeration :role +end + +@user.role_admin! +``` + +```ruby +class User < ActiveRecord::Base + enumeration :type, class_name: Role +end + +@user.type_editor! +``` + + + +## Finder methods + Find enumerations by `id`: ```ruby -@post.status = Status.find(2) # => Review pending +@post.status = Status.find(2) # => Review pending @post.save ``` Compare enumerations: ```ruby -@post.status == :published # => true -@post.status == 3 # => true -@post.status == Status.find(:published) # => true -@post.status.published? # => true +@post.status == :published # => true +@post.status == 3 # => true +@post.status == Status.find(:published) # => true +@post.status.published? # => true ``` Get all enumerations: ```ruby Status.all ``` + + +## Scopes on model + +With enumerations, you'll get scope for each enumeration value in the +following format: + +```ruby +with_#{enumeration_name}_#{enumeration_value_name} +``` + +Examples: + +```ruby +class Post < ActiveRecord::Base + enumeration :status +end + +Post.with_status_draft # => <#ActiveRecord::Relation []> +Post.with_status_review_pending # => <#ActiveRecord::Relation []> +``` + +```ruby +class Post < ActiveRecord::Base + enumeration :my_status, class_name: Status +end + +Post.with_my_status_draft # => <#ActiveRecord::Relation []> +Post.with_my_status_review_pending # => <#ActiveRecord::Relation []> +``` + +Each scope returns all records with specified enumeration value. + + + +## Forms usage + Use in forms: ```ruby %p = f.label :status_id @@ -106,21 +189,21 @@ ===== Except `id` and `name` you can specify other attributes to your enumerations: ```ruby -class Status < Enumeration::Base +class Status < Enumerations::Base value :draft, id: 1, name: 'Draft' value :review_pending, id: 2, name: 'Review pending', description: 'Some description...' value :published, id: 3, name: 'Published' end ``` Every enumeration has `id`, `name` and `description` methods. If you call method that is not in attribute list for enumeration, it will return `nil`. ```ruby -Status.review_pending.description # => 'Some description...' -Status.draft.description # => nil +Status.review_pending.description # => 'Some description...' +Status.draft.description # => nil ``` Author ======