3

在我的Rails3应用程序中,我正在使用ActiveRecordand Postgresql

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

但是,客户 A 可能想要添加LotNumber,客户 B 可能想要添加OriginalLocation.

我怎么会允许他们这样做?

我考虑过创建一个PartsDetail模型,让他们有一个类型。

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

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

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

有任何想法吗?

谢谢。

4

2 回答 2

3

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

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

甚至还有一个可以添加hstore对 ActiveRecord 的支持的 gem:

https://github.com/softa/activerecord-postgres-hstore

然后你可以创建一个hstore名为的列,比如说,client_specific并在其中查看如下内容:

M.where("client_specific -> 'likes' = 'pancakes'")
M.where("client_specific @> 'likes=>pancakes'")

看看哪些客户注意到他们喜欢煎饼。

您可能希望将客户特定字段列表与客户记录一起存储在某处,以使 UI 方面的事情更容易处理,但这很容易做到。

于 2012-05-09T19:11:39.897 回答
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'
于 2012-11-05T21:56:24.443 回答