在我的Rails3
应用中,我使用ActiveRecord
和Postgresql
。
假设我有一个名为部件的模型。该模型有一小部分标准属性,如价格,数量等。
但是,客户A可能希望添加LotNumber
,而CustomerB可能希望添加OriginalLocation
。
我如何允许他们这样做?
我考虑创建一个允许他们拥有类型的 PartsDetail 模型。
class PartsDetail < ActiveRecord::Base
attr_accessible :type, :value, :part_id
belongs_to :parts
end
所以“类型”可以是“LotNumber”等等。
但我不太确定这会如何在我的协会和查询中发挥作用。
有什么想法吗?
感谢。
答案 0 :(得分:3)
由于您使用的是PostgreSQL,因此可以使用hstore
在数据库列中存储任意哈希值:
该模块实现了hstore数据类型,用于在单个PostgreSQL值中存储键/值对的集合。这在各种场景中都很有用,例如具有许多很少检查的属性的行或半结构化数据。键和值只是文本字符串。
甚至还有一个宝石可以为ActiveRecord添加hstore
支持:
然后,您可以创建一个名为hstore
的{{1}}列,并使用以下内容查看其中:
client_specific
了解哪些客户注意到他们喜欢煎饼。
您可能希望在客户记录的某处存储客户特定字段的列表,以使UI方面更容易处理,但这很简单。
答案 1 :(得分:1)
以下是有人编写的要点,它允许您更加无缝地在模型中使用hstore属性:https://gist.github.com/2834785
使用在初始化程序中添加它(或创建一个名为active_record_extensions.rb的新初始化程序)
require "hstore_accessor"
然后在你的模型中你可以:
Class User < ActiveRecord::Base
hstore_accessor :properties, :first_name, :last_name
end
允许你这样做:
u = User.new
u.first_name = 'frank'
您仍然可以将属性添加到hstore列并绕过hstore_attributes:
u.properties['middle_name'] = 'danger'