允许用户创建动态模型属性?

时间:2012-05-09 18:15:48

标签: ruby-on-rails-3 postgresql activerecord

在我的Rails3应用中,我使用ActiveRecordPostgresql

假设我有一个名为部件的模型。该模型有一小部分标准属性,如价格,数量等。

但是,客户A可能希望添加LotNumber,而CustomerB可能希望添加OriginalLocation

我如何允许他们这样做?

我考虑创建一个允许他们拥有类型的 PartsDetail 模型。

class PartsDetail < ActiveRecord::Base
    attr_accessible :type, :value, :part_id
    belongs_to :parts
end

所以“类型”可以是“LotNumber”等等。

但我不太确定这会如何在我的协会和查询中发挥作用。

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:3)

由于您使用的是PostgreSQL,因此可以使用hstore在数据库列中存储任意哈希值:

  

该模块实现了hstore数据类型,用于在单个PostgreSQL值中存储键/值对的集合。这在各种场景中都很有用,例如具有许多很少检查的属性的行或半结构化数据。键和值只是文本字符串。

甚至还有一个宝石可以为ActiveRecord添加hstore支持:

  

https://github.com/softa/activerecord-postgres-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'
相关问题