2009-05-29 15 views
8

Şu anda insanların farklı kaynak eklemeye ilişkin isteklerine yöneticilerin gönderebileceği intranet web uygulaması yapıyorum.Ruby on Rails'de polimorfizmi kullanmanın alternatifleri

  • o
  • sadece ihtiyaç duyduğu disk alanı miktarını girecek bu durumda kullanıcı, kotalarını artırmak yüklü istediği hangi programın seçecektir bu durumda kullanıcı, programlar yükleyerek ya da belki o olacak: örnek istekleri olurdu Önceden tanımlı miktarları seçin - 1GB, 10GB vb ...
  • Yeni e-posta takma adı oluşturun, bu durumda kullanıcı takma adı yazacaktır.
  • ...
Ben örneğin Programı (diğer tablolara refefrence olacağını kimse REFERENCE_ID olacağını gönderici ve iki İsteğe bağlı ayrıntıların atfen sadece bir modeli UserRequests sahip düşünüyordum

bu onun ve başka bir e-posta takma adı veya kota gibi serbest tür alanlar için kullanılır.

Yani benim sorunum isteği türüne göre modeli ya içermelidir ki:

  • referans dayanarak
  • dize verileri

  • tamsayı veri diğer tabloya Verilen eylemin türünün alınması gerekir - Muhtemelen e-posta takma adı raylardan eklenebilir ancak kullanıcı bilgisayarındaki uygulama elle yüklenir.

    Benzer sorun yaşayan biri var mı? Bu tür şeyler için polimorfizm kullanmanın iyi bir fikir olduğunu mu düşünüyorsunuz? Tablolarda veri düzenlemeye yönelik herhangi bir öneriniz var mı?

  • cevap

    8

    Tekli Tablo Kalıtım! Bu şekilde, her istek türünün özel onaylamaları olabilir, ancak yine de her istek aynı tabloda yayınlanır. email veya etajer için string_data ve integer_data takma

    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 
    

    Ve tabii

    , diğer kod biraz daha anlama sahip olmak için. Model, hepsini saklayan küçük kara kutu olsun.

    +0

    Tam olarak aradığım şey budur ve mesajınız aklımı biraz aydınlattı. Teşekkürler. –

    +0

    Ian haklı, STI talebiniz için mükemmel. Bu durumda, polimorfizmin yararlı olacağı bir örnek için, hem istekte bulunan bir Kullanıcıya sahip olmanız hem de bir istekte bulunan bir Programın olması gerekir.Daha sonra hem polimorfizm sayesinde çok sayıda istekleri olabilir, hem de istekleri istedikleri kadar STI olabilir. – Houen

    2

    Bir modelin tek bir ilişkilendirme kullanarak birden fazla başka modele ait olmasını sağlayan polimorfik ilişkileri kullanırdım. Böyle bir şey: Her zamanki gibi

    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 
    
    • Ryan Bates konuda mükemmel bir Railscast sahiptir.
    +0

    Bu ilginç bir durumdur ancak bu durumda her türlü istek için bir tablo/model oluşturmayı tercih etmemeyi tercih ederim. Demiryollarını da işaret ettiğin için teşekkürler. –