如何选择单一型号并坚持选择?

时间:2008-12-01 15:04:04

标签: ruby-on-rails ruby

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

您也可以通过简单的Singleton模式实现来逃避。有关将ActiveRecord对象设为Singleton的Rails Wiki的快速描述(见下文):http://wiki.rubyonrails.org/rails/pages/TipsAndTricks

制作单件ActiveRecord对象

  

如果您的桌子只有一张   入口,有助于跟踪a   没有数据库的数字序列   序列,你可以使用单身人士   像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

答案 1 :(得分:2)

我会选择boolean标志并创建嵌套的singleton资源(提升),我将在PartiesController本身(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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

--- 
party_id: 123

完成。如果您以后需要更多的完整性或更高级的关系,请稍后实施,而不是现在。

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