class Person
include ActiveModel::AttributeMethods
# 前缀
attribute_method_prefix 'clear_'
# 后缀
attribute_method_suffix '_contrived?'
# 前缀 + 后缀
attribute_method_affix prefix: 'reset_', suffix: '_to_default!'
# 要处理的属性
define_attribute_methods :name
attr_accessor :name
# 供查询属性及值
def attributes
{ 'name' => @name }
end
private
# 用 attribute 代替上面要处理的属性,加上前缀、后缀得到新的方法名,然后实现它们
def attribute_contrived?(attr)
true
end
def clear_attribute(attr)
send("#{attr}=", nil)
end
def reset_attribute_to_default!(attr)
send("#{attr}=", 'Default Name')
end
end
class Person < ActiveRecord::Base
attribute_method_affix prefix: 'me_mateys_', suffix: '_is_in_pirate?'
private
def me_mateys_attribute_is_in_pirate?(attr)
send(attr).to_s =~ /\bYAR\b/i
end
end
person = Person.find(1)
person.name # => 'Paul Gillard'
person.profession # => 'A Pirate, yar!'
person.me_mateys_name_is_in_pirate? # => false
person.me_mateys_profession_is_in_pirate? # => true
主要用到的方法,都在示例里。Active Record 基于它也实现了一个自己的 Attribute Methods.
attribute_method_prefix
attribute_method_suffix
attribute_method_affix
alias_attribute # 起别名
attribute_alias? # 起别名了?
attribute_alias # 原名字是...
define_attribute_methods
define_attribute_method
undefine_attribute_methods
generated_attribute_methods
Note: ActiveRecord::AttributeMethods include ActiveModel::AttributeMethods 并修改了它的部分函数,所以使用 Rails 的话,这些方法是用不了的。