2015-12-04 23 views
0

我有一點我想要照顧的情況,但我甚至不知道它是否可能。Rails移植列類型多態

在我的應用程序,我有一個模型,可以採取參數值,此參數可以是一個字符串或整數或布爾值。

而不是做兩個字符串列(在我的遷移)與一個標記爲「類型」(類型 - 真的!)和另一個標記爲「價值」(爲...價值!是!)我是想知道是否有可能只剩下列值,其中有多態類型。

該模型是一個taks屬性。這些屬性可以是:這個任務是否打開(例如鍵入「boolean」和值「true」)?此任務是否有一個百分比(鍵入「整數」,值「20」)?請注意,該表也有一個列名。

+0

對我來說這似乎很奇怪,值可以是3種不同的類型。你能否澄清一下你使用這個價值的例子,以便我們能夠提供更好的答案? –

回答

0

Polymorphism in Rails更多的是關聯相關項的類未知的關聯 - 而不是具有動態類型的數據庫列。

儘管可以在關係數據庫中使用兩個字符串列valuevalue_type實現動態列,並使用自定義getter來進行類型轉換,但它會變得非常混亂。另一種可能性是使用類似HSTORE或JSON列類型的東西,但是您是否真的需要它?是否有更好的方法來構建業務邏輯,而不是試圖將所有內容都塞進單個列中?

我猜你可能正在尋找的是類似於enum來表示你的模型的狀態。

class Ticket < ActiveRecord::Base 
    enum status: [ :open, :closed, :pending, :active ] 
end 

這將使用一個名爲status的整數列。

如果您想存儲其他信息,則應該謹慎使用額外的數據庫列。就像如果你想監視進度一樣,你會創建一個名爲tickets.progress的整數數據庫列。

+0

感謝您的回答,這非常有用。但是,我決定使用序列化器。事實上,我的數據類型在「輸出」處與輸入處相同,這正是我所尋找的。 – Naarsh

0

對於你的答案,是的,這是可能的,但不要這樣做。
它可以使用字符串的所有不同的情況:

  • 「整數:100」, 「整:23」 等
  • 「布爾:真」, 「布爾:假」 等

您將需要識別每種數據類型(使用concat)並將其轉換爲正確的類型,然後才能使用該值。


但它是完全錯誤的,它的實現將會非常複雜
我強烈建議不要使用這個例子或類似的東西。
我認爲這是一個錯誤的數據庫結構。

一般來說,如果你有一個你認爲可以包含多個數據類型的列 - 在你的數據庫中有一些錯誤,你應該重新設計你的數據庫。

通常情況下,最佳做法是分離到不同的列。
在你的情況下,你的列可以得到不同的類型,每種類型代表不同的信息。我認爲你的表應該有這些列:

  1. status_id - 將引用到另一個表,包含所有可能狀態(如果有超過2個選項)的狀態。
  2. progress/percentage - integer。


我的答案與關係型數據庫無關。