好的,基本上您正在尝试模仿无模式数据库,因为您希望不同的记录具有不同的属性。只要您只有一个自定义属性 pr。记录,这可能有效,但是如果您的记录的差异属性多于常见属性,那么您可能需要考虑拥有多个模型,查看 hstore 数据类型或查看文档数据库,例如 MongoDB。
更新
再次阅读您的问题,我想我有一个更好的解决方案,所以我删除了原来的问题。
我将把你的 ThingAttributes 类称为我认为的 - CustomAttribute 类。因为每条记录代表一个自定义属性。一个事物可以有许多(在您的示例中为五个)自定义属性。
所以你可以这样做:
class CustomAttribute < ActiveRecord::Base
belongs_to :thing
attr_accessible :name, :value
end
class Thing < ActiveRecord::Base
has_many :custom_attributes
end
现在你可以找到一个东西,通过写
my_thing = Thing.find(3)
然后,您可以通过编写找到它的 custom_attributes
my_thing.custom_attributes
这将返回一组自定义属性。但是,您(出于某种原因)要求哈希。这也可以做到。在您的 Thing 类中,定义此方法:
def custom_attributes_hash
custom_hash = {}
self.custom_attributes.each do |attr|
custom_hash[attr.name] = attr.value
end
custom_hash
end
现在,您可能还希望能够以方便的方式设置属性。在你的 Thing 类上定义它。
def set_custom_attribute(name, value)
return unless name.present? # Short circuits method if an empty string or nil is being used as name.
custom_attribute = self.custom_attributes.find_by_name(name) # Attemps to find custom attribute with the name
if custom_attribute.nil? # Executes block if no attribute was found
return unless value.present? # Short circuits method if nil or empty string was passed as value
self.custom_attributes.create(name: name, value: value) # Creates and saves new custom attribute
else
if value.present? # Updates existing attribute if passed is not an empty string or nil.
custom_attribute.update_attribute(:value, value)
else
custom_attribute.destroy # Deletes custom attribute from DB if set_custom_attribute was called with a nil or empty value.
end
end
end