2008-12-01 56 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 

完成。如果您以後需要更完整或更有愛的關係,請稍後再執行,而不是現在。

對於部署,只需確保該文件符號鏈接到共享目錄即可完成應用程序升級。