2014-03-27 69 views
0

我有一個名爲場Rails的孩子通過ID找到返回父類對象

class Field < ActiveRecord::Base 

end 

父類和一個名爲ProfileField

class ProfileField < Field 
    def self.base_class ; self ; end 
    def self.use_base_class; ProfileField; end 
    self.table_name = "fields" 

    def field_type 
    return "profile_field" 
    end 
end 

我有一個數據庫表「田」,有一個子類名爲field_type的列。 我在field_type列中使用Field.create和null創建了一個Field對象。 我也使用ProfileField.create創建了一個ProfileField對象並給出了「profile_field」類型。

比方說,Field對象(父類)的ID是10,子對象ProfileFiled ID是11. 當我做ProfileField.find(10)時,我會得到一個ProfileField對象。當我執行Profile.find(10)時,我還會得到一個Profile對象。 因爲ID爲10的對象是Profile對象而不是ProfileField對象,所以當我執行ProfileField.find(10)時,我不應該得到任何東西嗎?

+0

活動記錄會將您的請求/命令到SQL。所以,如果你有Field和ProfileField相同的表,那麼通過id查找應該返回兩個類的結果。也許你應該奉獻一個布爾字段來區分這兩個... –

+0

謝謝。我找到了答案。我需要一個類型列我的字段表,當創建一個新的對象時,它會自動填充對象類型。 – user1404536

+0

同樣的邏輯,不同的動作。我只是一個想法,而不是唯一的辦法。你放下自己的做法很好。保持。 –

回答

0

據我可以告訴你共享的代碼,你似乎手工實現單表繼承。然而,Rails(或者更確切地說,Active Record)並不知道你的意圖。它只知道兩個類使用同一個表。您可以簡單地在您的field_type列中添加「monkey」或任何其他任意值,AR不會知道它應該實際確定要使用的類。

STI唯一適當的指標是名爲type的表列。這是一個通用約定 - 僅用於此目的的保留列名。

Rails/AR將自行處理類型列。事實上,你可能不應該修補它。無論何時從表中選擇一條記錄,您都將根據類型列獲取對象類型,就像您實施期望的那樣。

在這裏看到的STI更多信息及其實現方法及用量:

http://eewang.github.io/blog/2013/03/12/how-and-when-to-use-single-table-inheritance-in-rails/

相關問題