我想为用户模型提供许多动态属性,例如电话,地址,邮政编码等,但我不想将每个属性添加到数据库中。因此,我为键值对和UserDetails
创建了一个名为belongs_to :User
的单独表格。
有没有办法以某种方式做一些像user.phone = "888 888 8888"
那样动态的东西,它本质上会调用一个函数:
UserDetail.create(:user => user, :key => "phone", :val => "888 888 8888")
然后有一个匹配的getter:
def phone
UserDetail.find_by_user_id_and_key(user,key).val
end
所有这些都是为了提供一些属性,如手机,拉链,地址等,而不是随意添加大量的吸气剂和制定者?
答案 0 :(得分:9)
您想使用委托命令:
class User < ActiveRecord:Base
has_one :user_detail
delegate :phone, :other, :to => :user_detail
end
然后,您可以user.phone = '888 888 888'
自由地进行user.phone
或像{{1}}一样进行咨询。 Rails会自动生成所有的getter,setter和动态方法
答案 1 :(得分:3)
您可以使用一些元编程来设置模型的属性,如下所示:(此代码未经过测试)
class User < ActiveRecord:Base
define_property "phone"
define_property "other"
#etc, you get the idea
def self.define_property(name)
define_method(name.to_sym) do
UserDetail.find_by_user_id_and_key(id,name).val
end
define_method("#{name}=".to_sym) do |value|
existing_property = UserDetail.find_by_user_id_and_key(id,name)
if(existing_property)
existing_property.val = value
existing_property.save
else
new_prop = UserDetail.new
new_prop.user_id = id
new_prop.key = name
new_prop.val = value
new_prop.save
end
end
end