2010-03-22 84 views
0

Rails 2.1.0(由于受到几个限制,现在无法升级) 我正试图实现这一点。任何提示?Rails 2:has_many:通过验证?

  1. 一个项目有许多用户通过加盟模式
  2. 用户有很多项目,通过加盟模式
  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 

该方法是否正确?任何和所有的建议是受欢迎的。

回答

0

我结束了使用管理,主管和运营商的虚拟属性 一切通过ORM协会

0

我想通了,答案就在单表继承与的has_many:通过

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| %> 

等等......