1

我目前正在开发一个 Ruby on Rails 应用程序,该应用程序的功能类似于特定于站点的社交网站。作为其中的一部分,网站上的每个用户都会有一个个人资料,他们可以在其中填写他们的联系信息(电话号码、地址、电子邮件地址、雇主等)。

对此建模的一个简单解决方案是,我允许用户输入的每条信息都有一个数据库列。然而,这似乎是武断和有限的。此外,为了支持允许用户输入任意数量的电话号码,需要添加另一个数据库表和连接。

在我看来,更好的解决方案是将用户输入的所有联系信息序列化到他们行中的单个字段中。由于我永远不会根据这些信息来调整 SQL 查询,因此这样的解决方案的效率不会降低。

理想情况下,我想使用 vCard 作为我的序列化格式。vCard 是在 Web 上存储联系信息的标准解决方案,重复使用经过测试的解决方案是一件好事。替代的序列化格式将包括简单地编组一个 ruby​​ 哈希或 YAML。不管序列化格式如何,支持以类似 rails 的方式读取和更新这些信息似乎是一个主要的实现挑战。

那么,问题来了:有人见过这种方法在 Rails 应用程序中使用吗?是否有任何 Rails 插件或 gem 可以使这样的系统易于实现?

理想情况下,我想要一个acts_as_vcard 添加到我的模型对象中,该对象将为我处理编辑vcard 并将其保存回数据库。

4

2 回答 2

1

vCard 适用于 API,但对于实际数据库,我会使用 1-many 设计。每个人可以有许多电话号码、地址、电子邮件地址、过去的雇主。对于当前雇主,您可以建立 1-1 关系。我认为您对加入的厌恶是错误的。使用适当的索引,性能应该没问题。与不断序列化和反序列化非规范化字符串表示相比,实现将简单得多。您不必在考虑时重新发明轮子。

于 2010-06-06T02:01:26.890 回答
0

1)如果你确实想去序列化路线 rails 内置了对存储哈希的支持

来自http://api.rubyonrails.org/classes/ActiveRecord/Base.html

class User < ActiveRecord::Base
    serialize :preferences
end

user = User.create(:preferences => { "background" => "black", "display" => large })
User.find(user.id).preferences # => { "background" => "black", "display" => large }

如果您使用这种技术,我会将序列化字段放在它自己的模型/表对象上,否则它将包含在每个用户查找调用中,这并不理想,也许

class User < ActiveRecord::Base
    has_one :contact_info
end

class ContactInfo < ActiveRecord::Base
    has_many :users
    serialize :data
end

# ...
user.contact_info.data[:phone_numbers] # => ['999 999-9999', '000 000-0000']

2)或者如果你想去 noSql 路线 rails 支持 mongodb,你基本上会将联系信息嵌入到用户模型/文档中

3)或者只是使用额外的表,它并不像看起来那么糟糕,rails 迁移在这里可以帮助满足不断变化的需求

于 2010-06-06T02:33:27.373 回答