代码之家  ›  专栏  ›  技术社区  ›  Ram on Rails

Rails 2:有多少:通过验证?

  •  0
  • Ram on Rails  · 技术社区  · 15 年前

    Rails 2.1.0(由于多个限制,目前无法升级) 我正在努力做到这一点。有什么提示吗?

    1. 一个项目通过join模型有许多用户
    2. 用户通过join模型有许多项目
    3. 管理类继承用户类。它还有一些特定于管理的东西。
    4. 管理者和操作员的管理式继承
    5. 项目有一个管理员、一个主管和许多操作员。

    现在我想 1。以单个项目表单提交项目、管理员、主管和操作员的数据 2。验证所有项目并在项目窗体上显示错误。

    Project has_many :projects_users ; has_many :users, :through => :projects_users
    User has_many :projects_users ; has_many :projects, :through => :projects_users
    ProjectsUser = :id integer, :user_id :integer, :project_id :integer
    ProjectUser belongs_to :project, belongs_to :user
    Admin < User # User has 'type:string' column for STI
    Supervisor < User
    Operator < User
    

    方法正确吗?欢迎提出任何建议。

    3 回复  |  直到 12 年前
        1
  •  0
  •   Hock    15 年前

    我想单表内插和嵌套表单可以帮助您解决这个问题。您可能想在文档中了解它。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html

        2
  •  0
  •   Ram on Rails    15 年前

    我发现答案在于单表继承和has-many:through

    class Project < ActiveRecord::Base
      has_many :projects_users, :dependent => :destroy
      has_many :users, :through => :projects_users, :dependent => :destroy
      has_one :admin, :through => :projects_users, :source => :user, :conditions => {:type => "Admin"}
      has_one :supervisor, :through => :projects_users, :source => :user, :conditions => {:type => "Supervisor"}
      has_many :operators, :through => :projects_users, :source => :user, :conditions => {:type => "Operator"}
      validates_presence_of :name
      validates_associated :admin
    
      def admin_attributes=(attributes)
        # build an admin object and apply to this relation
      end
    
      def supervisor_attributes=(attributes)
        # build a supervisor object and apply to this relation
      end
    
      def operator_attributes=(operator_attributes)
        operator_attributes.each do |attributes|
          # build an operator object for each set of attributes and apply to this relation
        end
      end
    end
    
    class User < ActiveRecord::Base
      has_many :projects_users, :dependent => :destroy
      has_many :projects, :through => :projects_users, :dependent => :destroy
      validates_presence_of :name
      validates_associated :projects
    end
    
    class ProjectsUser < ActiveRecord::Base
      belongs_to :project
      belongs_to :user
    end
    
    class Admin < User
    end
    
    class Supervisor < User
    end
    
    class Operator < User
    end
    

    现在我们可以有以下内容

    project1.users # User objects for admin, supervisor and operators
    project1.admin # User object for Admin
    project1.supervisor # User object for Supervisor
    project1.operators # User objects for Operator
    

    包含所有这些元素的复杂形式

    <% form_for :project ...
        <% fields_for "project[admin_attributes]", @project.admin do |admin_form|
        ...
        <% @project.operators.each do |operator| %>
            <% fields_for "project[operator_attributes][]", operator do |operator_form| %>
    

    等等……

        3
  •  0
  •   Ram on Rails    15 年前

    我最终为管理员、主管和操作员使用了虚拟属性 其他的一切都通过了ORM协会