2008-12-01 51 views
2

我有一个称为Party的简单模型,其中有一个名为parties的对应表。还有一个包含所有常见CRUD操作的控制器等等。这个模型在一个网站中使用,只有一个管理员用户被允许编辑各方 - 其他人都可以调用GET操作(索引,显示)。迄今为止没有特别的。如何选择单个模型并坚持该选择?

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

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

我希望我的解释能够理解这个问题。

回答

3

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

使用另一种模式可以让您保留一些更多的信息,比如它应该保留在首页(过期日期?)多长时间,还是多少次(假设聚会可以使用两次)。这真的取决于您的系统的其他要求。

你也可以通过Singleton模式的简单实现逃脱。有上做出一个ActiveRecord对象一个Singleton的Rails的维基的简短描述(见下文):http://wiki.rubyonrails.org/rails/pages/TipsAndTricks

制作一个单独的ActiveRecord对象

如果你只有一个 条目的表,有用用于跟踪对一个数据库数目 序列的无 序列,可以使用包含在红宝石单身 模块像这样:

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 

更新:

这是一个非常差的代码示例(被复制并从轨道维基,其具有无格式粘贴)。我强烈推荐[Ruby Design Patterns]一书,它详细解释了许多GoF设计模式(同时使它们适用于Ruby应用程序)。但是Google应该会返回一些在Ruby中使用Singleton模式的好资源。 2

2

我会去布尔标志并创建嵌套单例资源(提升),我将在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 
0

个人我对数据的完整性非常强的我的数据库中执行,让可能会增加额外的表,并执行它,因为一个外键约束。 看起来像是过度杀毒,但它是防止数据完整性问题的唯一解决方案。

你可能可以将它作为字段添加到管理表/模型 - 这将是党表的强制外键?

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

+0

我总是在数据库中执行我的域规则(例如派对必须有位置和日期),但感觉应用程序特定的逻辑可以愉快地生活在模型中。 未来,他们可能会推动多于一方或向不同用户推广不同方。业务规则=我的模型。 – RichH 2008-12-03 20:43:22

1

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

+0

该模型与RESTful应用程序无关 - 这就是所有关于控制器的问题。两个控制器 - > 1型号很好。 也就是说,我也要添加第二个模型! – RichH 2008-12-03 20:47:50

0

保持简单。将promoted_party.yml文件放入控制器写入和读取的config目录中。内容可以如此简单:

--- 
party_id: 123 

完成。如果您以后需要更完整或更有爱的关系,请稍后再执行,而不是现在。

对于部署,只需确保该文件符号链接到共享目录即可完成应用程序升级。