Skip to content

Commit

Permalink
Merge pull request #6 from grauwoelfchen/uniqueness-validation
Browse files Browse the repository at this point in the history
Add uniqueness validation support.
  • Loading branch information
kenn committed Dec 29, 2015
2 parents eec742d + ea97d56 commit c6f351b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/enum_accessor.rb
Expand Up @@ -16,14 +16,18 @@ def enum_accessor(column, keys, options={})
else
raise ArgumentError.new('enum_accessor takes Array or Hash as the second argument')
end
freezed_dict = dict.with_indifferent_access.freeze

# Define class attributes
definition = options[:class_attribute] || column.to_s.pluralize.to_sym
class_attribute definition
class_attribute "_human_#{definition}"
send "#{definition}=", dict.with_indifferent_access.freeze
send "#{definition}=", freezed_dict
send "_human_#{definition}=", {}

# Define as enums
defined_enums[column.to_s] = freezed_dict

# Getter
define_method(column) do
send(definition).key(read_attribute(column))
Expand Down
16 changes: 16 additions & 0 deletions spec/enum_accessor_spec.rb
Expand Up @@ -107,6 +107,22 @@ class UserValidateAllowNil < ActiveRecord::Base
expect(user.valid?).to be_truthy
end

it 'supports uniqueness validation' do
class UserValidateWithUniqueness < ActiveRecord::Base
self.table_name = :users
enum_accessor :gender, [:female, :male]

validates :gender, uniqueness: true
end

UserValidateWithUniqueness.create!(gender: :male)

user = UserValidateWithUniqueness.new
user.gender = 'male'
expect(user.valid?).to be_falsey
expect(user.errors[:gender]).to eq(['has already been taken'])
end

it 'supports find_or_create_by' do
# `find_or_create_by` uses where-based raw value for find,
# then passes the raw value to the setter method for create.
Expand Down

0 comments on commit c6f351b

Please sign in to comment.