好了,基本上你想模仿無模式數據庫,因爲您希望不同的記錄具有不同的屬性。只要你只有一個自定義屬性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
現在,您可能希望能夠以便捷的方式設置屬性。在你的課堂上定義這個。
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
你能澄清你的問題。我對你的措辭感到困惑。 – jason328 2013-05-10 19:50:31
對不起。我認爲我的頭銜可能是錯誤的。我會盡力澄清。 – netricate 2013-05-10 19:58:18
你想要這個散列究竟是什麼?每個記錄標籤的彙總?該表應該是一個統一的散列圖嗎?我的意思是,如果你有50條記錄,你想要一個有50個鍵和50個值的散列嗎?你會接受多個具有相同標籤(密鑰)的記錄嗎? – 2013-05-10 20:20:07