【问题标题】:Rails best practice: another model or more model fields?Rails 最佳实践:另一个模型还是更多模型字段?
【发布时间】:2011-06-14 01:39:19
【问题描述】:

我正在我的 rails 应用程序中处理员工审查部分。到目前为止,有人对 7 个类别进行了审核,这意味着我想要对每个类别进行评分和评论。

拥有一个包含每个类别评分和评论字段的评论模型会更好吗?或者我应该有两个模型 - 一个评级模型和一个评论模型,其中评论模型有_许多评级,以及评级属于_评论?我试图记住,我将来可能会添加、更改或删除评论类别。

谢谢!

【问题讨论】:

    标签: ruby-on-rails model


    【解决方案1】:

    可以说这是一个数据建模最佳实践问题,而不仅仅是一个 Rails 最佳实践问题。如果不了解您的问题领域,很难给出 100% 准确的答案。

    最大的灵活性来自多模型方法。将来添加(或删除)类别会更容易。但是,如果您希望这些表中有大量条目,则可以从单一模型方法中获得更好的性能。

    【讨论】:

    • 使用类别类型表可以轻松添加新类别(只需向类型表添加新行),假设引用完整性设置正确,删除类别也很容易:只需删除该类别类型。
    • 谢谢。我完全错过了添加类别模型的步骤。您会如何看待大量条目?
    • @NicSlim “大量条目”阈值最终取决于您使用的数据库品牌、访问数据库的并发用户数以及托管数据库的硬件的功能。如果您以千为单位测量条目数,则可能没问题。数十万,可能不会。
    【解决方案2】:

    如果以后添加新字段很简单(不是很多变更控制/文书工作等),我会选择这些字段。

    如果您需要在不更改代码的情况下灵活地添加新类别,那么您需要有 3 个模型:

    Review 
      has_many :ratings
    
    Category
      has_many :ratings
    
    Rating
      belongs_to :review
      belongs_to :category
    

    将类别名称存储在Category 中,将数值存储在Rating

    【讨论】:

      【解决方案3】:

      记得保持干燥。如果您有多个模型做完全相同的事情(评级 + 类别上的 cmets),具有相同的控制器和视图,那么您的代码是not DRY

      您可以轻松地创建一个模型(以及控制器和视图),为每个类别对象分配一个类型。所以说你的类别是["On Time", "Dresses neatly", "Keeps desk clean"] 现在你将把它们都作为你的模型的一个类型。

      事实上,我会将 Category 表设为三向连接

      Category belongs_to [Type, User, Supervisor]

      类别包括评分和评论。

      下面是 Category 对象的样子:

      id: 203
      type_id: 2
      rating: 4
      comment: "Seems to get to work on time, 
                but usually late coming back from lunch"
      user_id: 2
      supervisor_id: 1
      created_at: (whatever)
      updated_at: (whatever)
      

      你有你的类型对象

      id: 2
      name: "On Time"
      

      您的用户对象

      id: 1
      name: Dick Jones
      supervisor_id: null
      
      id: 2
      name: Clarence J. Boddicker
      supervisor_id: 1
      

      【讨论】:

      • 是的。有一个单独的类型对象是有意义的。最初我认为类别只是评级模型中的一个附加字段。您能否详细说明我的评论模型和评级模型的原始结构如何不是 DRY? Review 模型将只保存主管 ID 和审查日期。
      【解决方案4】:

      如果你想规范化,那么肯定是另一个表。我有一个 Review 模型和 Category 模型 (Review has_many :categories),但我不熟悉您的问题域。但是,如果下次对 8 个类别的人进行审核,那么如果您有单独的表格,则无需考虑添加一个。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多