在Ruby on Rails中存储任意联系信息

时间:2010-06-06 01:57:13

标签: ruby-on-rails vcard

我目前正在开发一个Ruby on Rails应用程序,该应用程序将在某些方面运行,如特定于站点的社交网站。作为其中的一部分,网站上的每个用户都将有一个配置文件,他们可以填写他们的联系信息(电话号码,地址,电子邮件地址,雇主等)。

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

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

理想情况下,我想使用vCard作为序列化格式。 vCards是在网络上存储联系信息的标准解决方案,重用经过测试的解决方案是一件好事。替代序列化格式包括简单地编组ruby散列或YAML。无论序列化格式如何,支持以类似轨道的方式读取和更新此信息似乎是一项重大的实施挑战。

所以,问题是:有没有人在rails应用程序中看到过这种方法?是否有任何导轨插件或宝石使这样的系统易于实现?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 route rails支持mongodb,你基本上可以将联系信息嵌入到用户模型/文档中

3)或者只是使用其他表格,它没有看起来那么糟糕,rails迁移可以在这里帮助改变需求