2012-02-11 75 views
5

我有我包括多種型號與此內容模塊:如何在Rails中始終使用基類並忽略STI?

self.class.find_by_foo(bar) 

一切都很好,直到我開始使用STI。該行應始終生成查詢

select * from table where foo=bar" 

select * from table where foo=bar AND type="Whatever" 

有沒有一種簡單的方法來避免呢?

我雖然有兩種解決方案。走了的類層次結構,直到我找到ActiveRecord::Base前的最頂層類或手動運行查詢,如:

self.class.find_by_sql("select * from #{self.class.table_name} where foo=bar") 

我不喜歡任何一個解決方案。有更好的嗎?

回答

2

,直到有更好的答案,我使用這個代碼,以查找基類中的STI鏈:

klass = self.class 
self.class.ancestors.each do |k| 
    if k == ActiveRecord::Base 
    break # we reached the bottom of this barrel 
    end 
    if k.is_a? Class 
    klass = k 
    end 
end 
19

首先,你總是可以得到與方法BASE_CLASS基類:

self.class.base_class.find_by_foo(bar) 

但是,在上面的示例中,您不必訪問基類。你可以做以下和Rails會知道正確的表名:

self.class.where(:foo => bar) 

實際上有極少數情況下,當你需要訪問的基類。

+0

在Rails 4中'self.class'出乎意料地返回了對象父類,在Rails 5'self.class'中返回,例外的是models類。 'self.class.base_class'可以用來獲取父類。 – Kris 2017-11-13 10:28:23

相關問題