2009-05-29 29 views
8

私は現在、人がさまざまなリソースを追加するために管理者の要求に提出できるイントラネットWebアプリケーションを作成しています。例えば、要求は次のようになります。プログラムをインストールRuby on Railsでポリモーフィズムを使用する代わりに

  • 、この場合には、ユーザは自分がインストールさ
  • 増加クォータを希望するプログラムを選択しますが、この場合には、ユーザはちょうど彼が必要とするディスク容量を入力しますまたは多分彼は意志あらかじめ定義された量 - 1GB、10GBなどを選択してください。
  • 新しいメールエイリアスを作成します。この場合、ユーザーはエイリアスを入力するだけです。
  • ...私は彼のプログラム 例えば(送信者を基準としただけで1つのモデルUserRequestsや他のテーブルにrefefrenceだろう1はREFERENCE_IDされるだろう 2つのオプションの属性を持っていることについて考えていた

インストールされたい)、フリータイプのフィールド (別名、クォータなど)に別のものが使用されます。

だから私の問題は、要求のタイプに基づいてモデルはどちらか含まれていなければならないことである。

  • 他のテーブルを参照
  • 整数データ
  • 文字列データに基づいて

指定されたアクションを取るべき要求のタイプ - おそらく電子メールエイリアス はレールから追加できますが、ユーザのコンピュータ上のアプリケーションは手動でインストールされます。

誰も同じような問題を抱えていますか?この種のものに多型を使用することは良いアイデアだと思いますか?テーブル内のデータをどのように整理するかについてご意見はありますか?

答えて

8

シングルテーブル継承!このようにして、各タイプのリクエストにカスタムのバリデーションを持たせることができますが、依然としてすべてのリクエストを同じテーブルに配置します。あなたの他のコードを作るためにあなたのstring_dataemailやその他もろもろにinteger_dataエイリアス

class CreateUserRequests < ActiveRecord::Migration 
    def self.up 
    create_table :user_requests do |t| 
     t.string :string_data, :type 
     t.integer :user_id, :integer_data 
     t.timestamps 
    end 
    end 
    def self.down 
    drop_table :user_requests 
    end 
end 


class UserRequest < ActiveRecord::Base 
    belongs_to :user 
end 

class EmailAliasRequest < UserRequest 
    validates_presence_of :string_data 
    validates_format_of :string_data, :with => EMAIL_REGEX 
end 

class ProgramInstallRequest < UserRequest 
    belongs_to :program, :class_name => "Program", :foreign_key => "integer_data" 
    validates_presence_of :integer_data 
end 

class QuotaIncreaseRequest < UserRequest 
    validates_presence_of :string_data 
    validates_inclusion_of :string_data, :in => %w(1GB 5GB 10GB 15GB) 
end 

そしてもちろんのは、もう少し意味を持ちます。モデルをすべて隠す小さな黒い箱にしましょう。

+0

これはまさに私が探していたもので、あなたのポストは私の心を少し明るくしました。ありがとう。 –

+0

イアンはそうです、STIはあなたのリクエストに最適です。この場合、多態性が有用な場合の例としては、has_many要求を持つユーザーとhas_many要求を持つユーザーの両方がある場合です。その後、多型性のおかげで多くのリクエストが可能になり、依然としてSTIになることができます – Houen

2

多相関連を使用して、1つの関連を使用してモデルが複数の他のモデルに属するようにします。このような何か:いつものよう

class AdminRequest < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :requestable, :polymorphic => true 
end 

class EmailAlias < ActiveRecord::Base 
    has_many :admin_requests, :as => :requestable 
end 

class ProgramInstall < ActiveRecord::Base 
    has_many :admin_requests, :as => :requestable 
end 

class QuotaIncrease < ActiveRecord::Base 
    has_many :admin_requests, :as => :requestable 
end 
  • 、ライアンベイツは、件名に優れたRailscastを持っています。
+0

これは興味深いですが、この場合、あらゆる種類の要求に対してテーブル/モデルを作成しない方がよいでしょう。鉄道を指摘してくれてありがとう。 –

関連する問題