2014-02-18 60 views
0

我有一個RoR應用程序(開發中)。我有基於sql視圖的模型。如何在rails中安全地覆蓋保存方法?

但是,我想創建&更新thoses模型。它們通過2個表(通用設計模式,這就是爲什麼我使用sql視圖)存儲在數據庫中。

我聽說過諸如before_save之類的鉤子,但如here所述,仍然存在保存或更新before_save回調中的其他對象的問題。

所以,我想知道如何安全地重寫軌道中的保存方法?

歡迎任何建議。

感謝

編輯:

我看來

CREATE VIEW my_objects AS 
SELECT o.* , 
at.value as "column1", 
FROM 
Generic_object o 
LEFT JOIN (SELECT at.* FROM Another_table at ON at.genreic_object_id = o.id AND at.name = "param1") 

這導致從我的普通表中的 「重建」 對象,然後從另一個表中的一些列的SQL

o.col1,o.col2,...,at.param1

如果我的對象有幾個參數我要重新加入另一個表,這樣

LEFT JOIN(SELECT AT2。* FROM Another_table AT2 ON at2.generic_object_id = o.id AND at2.name = 「參數2」)

然後,我得到這個對象:

o.col1,o.col2,...,at.param1,at2.param2

這似乎很少(奇怪? :p),但這種模式是我的約束.... :(

回答

0
def save 
# new object ? 
    # yes 
    q = Array.new 
    qualifiers.each do |qk| 
    q.push(Another_table.create(value: self.read_attribute(qk),name: qk)) 
    end 
    e = Generic_object.create(name: name,type: self.class,qualifiers: q) 

    # existing object 
    #bla bla 
end 
0

從我的經驗,我很少發現這樣的需要,我重寫常用的方法,而且我不推薦這麼做,因爲會有其他代碼取決於原始的方法。你的問題,必須有另一種更好的解決方案。

但是,如果你真的要,你可以安全地通過Ruby的alias_method,或alias_method_chain由ActivitySupport提供覆蓋它。

class Foo < ActiveRecord::Base 
    alias_method_chain :save, :my_feature 

    def save 
    blah_blah 
    save_without_my_feature # The original save method 
    end 
end 
+0

好吧,我已經嘗試過這個解決方案。 當sav e(沒有功能)被觸發,它引發了一個異常(我正在使用sql view basde模型)。 我可以存儲另一個對象來保存基於sql視圖模型的方法嗎? – foxpowa