2017-10-09 148 views
-1

使用Ruby的特定屬性指定的子類我有一個單表繼承層次結構類,如下所示:如何限制on Rails的

# Table name: blocks 
# 
# video_name :string 
# text_name  :string   
# 

class Block < ApplicationRecord 
    ... 
end 

class VideoBlock < Block 
end 

class TextBlock < Block 
end 

blocks表保存所有的屬性,這些屬性Block子類將使用。

我想說明如何訪問:

  • video_name只有當你正在處理VideoBlock對象
  • text_name只有當你正在處理TextBlock對象

怎麼辦我在Ruby on Rails中執行此操作? (使用5.x的具體)

回答

1

如果你想在子類牆上的了,你需要決定要如何處理這個問題。你想忽略放在那裏的數據,還是想嚇壞並着火?

有關着火:

class Video 
    validates :text_name, 
    absence: true 
end 

這將通過提高驗證異常隔離開的這一子分類的各種屬性。

忽視:

class Video 
    def text_name=(v) 
    # Ignored 
    end 
end 

這是不太可取的,因爲它吃,你可能要實際保存數據,但由於存在錯誤,正在失去。

1

您可以通過創建自定義getter和setter方法做到這一點:

class MyError < StdError; end 

class Block < ApplicationRecord 
    def video_name 
    raise MyError unless video? 
    super 
    end 

    def video_name=(value) 
    raise MyError unless video? 
    super 
    end 

    def video? 
    self.class.name == 'VideoBlock' 
    end 
end 
+1

你'提高'*或*你'返回'。這兩個看起來非常非常奇怪。 'raise'將會彈出一個exeption,'return'永遠不會運行。 – tadman

+0

好點@tadman – max