【问题标题】:How to choose a single model and persist that choice?如何选择一个模型并坚持这个选择?
【发布时间】:2008-12-01 15:04:03
【问题描述】:

我有一个名为Party 的简单模型和一个名为parties 的对应表。还有一个控制器,包含所有常见的 CRUD 操作等。此模型用于网站,只有一个管理员用户可以编辑各方 - 其他所有人都可以调用 GET 操作(索引、显示)。到目前为止没有什么特别的。

现在我需要执行以下操作:管理员想一次选择一个派对进行特殊演示(所选派对显示在应用程序的起始页面上)。最重要的是,选择的时间只有一个派对。

你会如何解决这个问题?派对模型中的布尔标志?将选择(聚会的 ID)保存在数据库之外的某个地方?实现一个与 Party 有 has_one 关系的新模型(对我来说似乎有点矫枉过正)?

我希望我的解释足以理解这个问题。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    一个简单的“front_page”属性就足够了,或者像你提到的其他模型,使用 has_one 关系也可以。

    使用其他模型可以让您保留更多信息,例如它应该在首页上保留多长时间(到期日期?)或它被推荐的次数(假设一个派对可以被推荐两次)。这实际上取决于您的系统的其他要求。

    您也可以使用单例模式的简单实现来摆脱困境。 Rails Wiki 上有一个关于使 ActiveRecord 对象成为 Singleton 的快速描述(见下文):http://wiki.rubyonrails.org/rails/pages/TipsAndTricks

    制作单例 ActiveRecord 对象

    如果你有一张只有一张桌子 条目,用于跟踪 无数据库的数字序列 序列,你可以使用单例 ruby 包含的模块如下:

    require 'singleton'
    
    class Master < ActiveRecord::Base
      include Singleton
      def initialize(args=nil) super(args) if record = Master.find(:first)    
        self.attributes = record.attributes end end def next_tracking_number increment!
        (:current_tracking_number) current_tracking_number end def 
        self.next_tracking_number instance.next_tracking_number 
      end
    end
    

    更新:

    这是一个非常糟糕的代码示例(从 Rails Wiki 复制和粘贴,没有格式化)。我强烈推荐 [Ruby Design Patterns] 这本书,它更详细地处理了许多 GoF 设计模式(同时使它们适用于 Ruby 应用程序)。但是Google 应该会为您返回一些在 Ruby 中使用 Singleton 模式的好资源。2

    【讨论】:

      【解决方案2】:

      我会选择布尔标志并创建嵌套的单例资源(已升级),我将在 PartyController 本身中实现它 (set_promoted_party and get_promoted_party actions)。为此,我将创建两条新路线:

      PUT /parties/promoted/:party_id # to set the promoted party
      GET /parties/promoted/:party_id # to get the promoted_party
      

      【讨论】:

        【解决方案3】:

        我将添加第二个具有 has_one 关系的模型,以保持应用程序 RESTful 和简单。此外,通过这种方式,您可以保留特殊派对的历史记录,并跟踪与特殊派对相关的其他有意义的信息。

        【讨论】:

        • 该模型与 RESTful 应用程序无关 - 仅与控制器有关。两个控制器 -> 1 个模型很好。也就是说,我也会添加第二个模型!
        【解决方案4】:

        就我个人而言,我非常重视由我的数据库强制执行的数据完整性,因此可能会添加那个额外的表并将其作为外键约束强制执行。 它看起来有点矫枉过正,但却是防止数据完整性问题的唯一*解决方案。

        您能否将其作为字段添加到管理表/模型中 - 这将是派对表的强制外键?

        *另一种解决方案是数据库触发器,它检查没有其他行是所选方,但我倾向于回避此类解决方案。

        【讨论】:

        • 我总是在数据库中执行我的域规则(例如,聚会必须有一个位置和日期),但我觉得应用程序特定的逻辑可以愉快地存在于模型中。将来,他们可能会推广超过 1 个派对或向不同的用户推广不同的派对。业务规则 = 我的模型。
        【解决方案5】:

        保持简单。在控制器写入和读取的配置目录中放置一个promoted_party.yml 文件。内容可以这么简单:

        --- 
        party_id: 123
        

        完成。如果您以后需要更多的诚信或更好的关系,请稍后实施,而不是现在。

        对于部署,只需确保将文件符号链接到共享目录以在应用程序升级后继续存在。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-27
          • 2021-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-17
          • 1970-01-01
          相关资源
          最近更新 更多