2016-03-15 80 views
2

假設我們有一個foos表,列bar。現在我們將該列重命名爲bar_primary並添加另一個 - bar_secondary。我們想要將bar的讀/寫行爲分配給這兩個屬性中的某些屬性。模型的代理

我希望是這樣的:

class Foo < ActiveRecord::Base 
    def bar 
    read_condition ? bar_primary : bar_secondary 
    end 

    def bar=(value) 
    if write_condition 
     self.bar_primary = value 
    else 
     self.bar_secondary = value 
    end 
    end 
end 

會做的伎倆,不過是這樣的:

foo['bar'] = 'baz' 

會打破它。現在我可以實施[]=,但這已經開始聞起來了。

有沒有一些鐵軌魔術我不知道這可能是有用的在這種情況下?

+0

刪除我的回答 - 我認爲這個問題屬於下*不清楚你問*,除非你能拿出你試圖解決實際問題的一個更具體的例子。 – max

+0

@max,儘管沒有提到原始用例,但我認爲這個問題不僅僅是明確的。代理/分派器,儘可能表現爲持久屬性。 – ndn

+0

難道你不能用'foo.bar ='baz''替換'foo ['bar'] ='baz''嗎?我認爲'foo ['bar'] ='baz''會直接跳到列,所以它會跳過setter :( – gabrielhilal

回答

0

別名傾向於涵蓋這種要求,但我不確定有條件別名。

看一看alias_attribute

+0

我試過'alias_attribute',但它似乎無法處理索引。它不適用於條件語句無論如何。 – ndn