2

2つのタイプのユーザABがあるとします。タイプBのユーザーは、権限が少なく、フィールドの検証がそれほど厳密ではありません(空白にすることもできます)。それ以外の場合は、基本的にタイプAと同じです。このことから、単一のテーブル継承を使用する傾向があります。モデルをレールで変換する(単一テーブル継承)

ここに私の懸念事項があります。タイプBは、Aにアップグレードできます。アップグレードする際には、関連するすべてのレコードを保持する必要があります。 STIを使用して、あるモデルタイプから別のモデルタイプに簡単に変換でき、すべての関連付けが保存されますか?簡単な例がありますか?

答えて

2

あなたがtype列に正しい値を与えていることを確認するだけです。

ユーザAにユーザBをアップグレードする際に、単にユーザーAの

クラス名にtype属性に格納されている値を変更します。

例:

class Staff < ActiveRecord::Base; end 
class PartTimeStaff < Staff; end 

part_time_staff = PartTimeStaff.first 
part_time_staff.type = "Staff" 
part_time_staff.save 

それはスタッフクラスにパートタイムのスタッフがアップグレードされます。

すべての関連付けは変更しないでください。あなたは1つの実際のSQLテーブルしか持っていないので。

PartTimeStaffとStaffクラスのすべての属性は、同じテーブルに保持されます。

Rails APISingle Table Inheritance

おかげ

+0

PSから詳細をご覧ください。 'type'カラムではなく、Single Table Inheritanceに他のカラム名を使用する場合は、モデルで** set_inheritance_column **メソッドを使用してください。 – peterpengnz

+0

ありがとう!まさに私が探していた/期待していたもの。 – Raphael

-1

おそらく、タイプフィールドを持つユーザーモデルを1つだけ持つことができ、検証はタイプによって異なります。

class User 
    validates :name, presence: true, if: :advanced_user? 

    protected 

    def advanced_user? 
    self.type == 2 
    end 
end 
関連する問題