【问题标题】:Storing Arbitrary Contact Information in Ruby on Rails在 Ruby on Rails 中存储任意联系信息
【发布时间】:2010-06-06 01:57:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails vcf-vcard


    【解决方案1】:

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

    【讨论】:

    • 我的反感不是加入。我不喜欢有一个电话号码表、一个地址表、一个电子邮件地址表等。使用 vCard 意味着添加存储新类型信息的能力只是视图更改,不需要创建一个新的数据库表。联系信息很复杂。我认为复杂性应该在应用程序层而不是数据库层处理。数据库更改总是比应用程序层更改更危险和更难进行,我不知道我的具体要求是静态的。
    【解决方案2】:

    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 迁移可以在这里为不断变化的需求提供很大帮助

    【讨论】:

    • 序列化路线实际上非常接近我正在寻找的。 (我不敢相信我不知道 Rails 内置了该选项。)但是,我真的希望能够隐藏在典型的活跃记录设置者/获取者背后的东西。
    • Rails 3.2 的 ActiveRecord 存储将使这更容易。
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多