2010-03-22 125 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| %> 

等等......