2014-10-02 68 views
0

我有性病是這樣的:如何將STI類重新分配給模型方法中的變量?

class Post 
end 

class Post::Confirmed < Post 
end 

class Post::Draft < Post 
    def confirm! 
    becomes Post::Confirmed 
    end 
end 

...# somewhere in controller 
# POST /posts/1/confirm 
# POST /posts/1/confirm.json 
def confirm 
    @post = Post::Draft.first 
    @post = @post.confirm! # this is the only way I can reload @post with Post::Confrmed 
end 

是它在某種程度上可能使:

@post.confirm! # I want this @post(Post::Draft) to become Post::Confirmed without reassigning 

還是僅僅也不回報率呢?

在此先感謝!

+2

你確定STI在這種情況下是否合適?不會有簡單的狀態標誌和一些範圍更有意義嗎? – 2014-10-02 21:21:10

+0

我雖然這樣做,但範圍有點大,然後在這個例子中:所有的子類作爲給定類的命名空間,所以草案有自己的方法和確認的職位 - 他們自己的。 我想我可能是錯的。但是,STI看起來仍然很完美。 – IlyaDoroshin 2014-10-02 21:21:46

+0

@ muistooshort想象一下,你有購物車。它在結構上與訂單相同:它有物品,總價格等,但每個類的方法都不同。 – IlyaDoroshin 2014-10-02 21:25:19

回答

0

我發現這種模式效果最好,它有一個datetime類型字段,用於記錄記錄被標記的時間。

例如:

def confirm! 
    self.confirmed_at = DateTime.now 
    self.save! 
end 

那麼你可以告訴的東西得到了證實。當您遇到被標記但還沒有的情況時(例如將來設置發佈日期),此功能尤其方便。

雖然看起來有點煩人沒有STI的技巧可用,但STI並不總是合適的工具。一般而言,STI是要區分類似但不同的模型,這些模型具有很多共同點或者在一個共同的環境中使用。它不應該被用來處理單一模型的不同狀態。

你想在這種情況下是一個狀態機類型模式。

+0

實際上,真的,但狀態機寶石是可怕的:政治家太複雜了,並且state_machine沒有維護一年.. 所有我想用「邦」的方法,這將改變實例(像所有的爆炸 - 方法)。但如果這是不可能的,我會堅持重新分配變量。對我而言,這種方式更加清晰和強大。謝謝你的回答,雖然) – IlyaDoroshin 2014-10-02 22:18:36

+0

我剛剛發現了另一個寶石,實際上看起來很有希望:aasm – IlyaDoroshin 2014-10-02 22:24:14

+1

狀態機型寶石並不總是得到很好的維護的原因是因爲你自己實現這種行爲是微不足道的。試一試。 – tadman 2014-10-05 19:25:29

相關問題