我有一个名为Party
的简单模型,其中包含一个名为parties
的对应表。还有一个控制器,包含所有常见的CRUD操作,等等。此模型在网站中使用,只允许一个管理员用户编辑各方 - 其他人都可以调用GET操作(索引,显示)。到目前为止没什么特别的。
现在我需要执行以下操作:管理员希望一次选择一个派对进行特殊演示(选定的派对将显示在应用程序的起始页面上)。最重要的是,选择时只有一个派对。
你会如何解决这个问题?派对模型中的布尔标志?在数据库之外的某个地方保存选择(聚会的ID)?实现一个与Party具有has_one关系的新模型(对我来说似乎有些过分)?
我希望我的解释足以理解这个问题。
答案 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
完成。如果您以后需要更多的完整性或更高级的关系,请稍后实施,而不是现在。
对于部署,只需确保将文件符号链接到共享目录,以便在应用程序升级后继续使用。