【问题标题】:Rails: Model can be one of several types - How to store it?Rails:模型可以是几种类型之一 - 如何存储它?
【发布时间】:2011-10-18 00:38:00
【问题描述】:

首先,抱歉标题不好,无法提出更具描述性的内容。

我有一个用户模型。我想为该用户设置一个类型,它可以是 5 个选项之一;不管选项是什么,任何字符串都可以。我希望能够根据这些选项进行搜索。

我认为我有以下选择:

  1. 将字段作为字符串添加到带有索引的模型中
  2. 创建一个 user_type 表并做belongs_to/has_many 关系
  3. 将类型保存为整数并将整数映射到用户模型中定义的常量,带有字符串值(虽然不知道如何执行此操作)

解决此问题的 Rails 方式 将满足以下目标:

  • 可搜索
  • 可维护
  • 可读

谢谢

【问题讨论】:

  • 您是否考虑过使用single table inheritance,并通过下拉菜单输入用户的类型?
  • @Jimmy 感谢您的链接。从 cmets 看来,我的选择 2 是要走的路。我会试试的

标签: ruby-on-rails model associations


【解决方案1】:

我会选择选项 #2,它可以让您动态添加用户类型而无需接触代码。如果将来您想让一个用户同时拥有多个不同类型,请查看has_and_belongs_to_many

【讨论】:

    【解决方案2】:

    这确实取决于您对“类型”的含义。如果它是一个角色(例如“管理员”、“版主”、“用户”等),其中给定的用户只能是一种类型,你可以用一个字符串列来做 -不需要单独的表格。

    如果用户可以同时是多种类型(“新注册”、“男性”、“学生”、“博主”),用户类型更像一个标签,那么你的user_type table 将完成这项工作。

    【讨论】:

    • 用户只能是一种类型,但我希望能够找到某种类型的所有用户,所以它是一种标签。许多用户可以拥有相同的标签。
    • 如果您希望能够找到某种类型的所有用户,那么您只需在列上搜索,通过scope(或Rails2 中的named_scope),或者做一个简单的User.find_by_role('administrator')(在此示例中,role 是列的名称),它将为您提供该类型的所有用户。您可以搜索任何表中的任何列,并按其中的内容进行过滤。
    • 谢谢,这比两张表的方法更有意义,看起来更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2020-01-27
    • 2019-09-01
    • 2017-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多