Getting started
attr_value_object
is a minimalistic module.
attr_value_object
is useful in the case when you have a model with multiple fields to represent the dependent property and you want to separate logic. For example, address of user. The fields are postcode
, prefecture_id
, street
and building
. If you are using Ruby on Rails, you will add columns into users with a migration. You may want to make them indicating explicitly a same property (address). So the User
model looks like following.
# ActiveRecord is not required.
# It's enough for `attr_value_object` to work if only these accessors are defined.
class User
attr_accessor :address_postcode,
:address_prefecture_id,
:address_street,
:address_building
end
If another model has the same property (address) and you want to JOIN
based on addresses
, it's good to create addresses
table. But there is the case you don't need such a function. However, you may still want to separate logic. Then, you can do it with creating Address
class and specifying attr_value_object
.
class Address
attr_accessor :postcode,
:prefecture_id,
:street,
:building
end
class User
extend AttrValueObject
attr_accessor :address_postcode,
:address_prefecture_id,
:address_street,
:address_building
attr_value_object :address
end
address = Address.new
address.postcode = '1000000'
address.prefecture_id = 1
address.street = 'Foo Bar Street'
address.building = 'AVO Building 34F'
user = User.new
# setter
user.address = address
user.address_postcode # => '1000000'
# getter
user.address # => #<Address> always new instance
API
#attr_value_object(name, options = {})
The binding class is inferred from name unless class_name
option is specified.
ToDo
- work with rails validations
- attribute mapping flexibility