代码之家  ›  专栏  ›  技术社区  ›  Jakub Troszok

RubyonRails中使用多态性的替代方法

  •  8
  • Jakub Troszok  · 技术社区  · 17 年前

    • 安装程序,在这种情况下,用户将选择要安装的程序
    • 增加配额,在这种情况下,用户只需输入所需的磁盘空间量,或者选择预定义的数量—1GB、10GB等。。。
    • 创建新的电子邮件别名,在这种情况下,用户只需键入别名。
    • ...

    我在考虑只使用一个模型UserRequests来引用发送者和 两个可选属性,一个是reference_id,它将引用其他表(例如 例如,他希望安装的程序)和另一个将用于自由类型字段

    因此,我的问题是,根据请求的类型,模型应该包含以下内容之一:

    • 参考其他表格
    • 整数数据
    • 字符串数据

    根据请求的类型,应该采取给定的操作-可能是电子邮件别名

    有没有人有类似的问题?你认为对这类东西使用多态性是个好主意吗?您对如何组织表中的数据有什么建议吗?

    2 回复  |  直到 17 年前
        1
  •  8
  •   Ian Terrell    17 年前

    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
    

    string_data integer_data email 或者其他什么让你的代码更有意义。让模型成为一个小黑匣子,把它全部隐藏起来。

        2
  •  2
  •   John Topley    17 年前

    我将使用多态关联,它允许一个模型属于使用单个关联的多个其他模型。大概是这样的:

    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