【问题标题】:Rails 2: has_many :through validation?Rails 2:has_many:通过验证?
【发布时间】:2010-03-22 14:49:01
【问题描述】:

Rails 2.1.0(由于一些限制,目前无法升级) 我正在努力实现这一目标。有什么提示吗?

  1. 一个项目通过join模型有很多用户
  2. 一个用户通过join模型拥有多个项目
  3. Admin 类继承 User 类。它还有一些特定于管理员的东西。
  4. 对于 Supervisor 和 Operator 类似 Admin 的继承
  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

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

【问题讨论】:

    标签: ruby-on-rails orm has-many-through has-many-polymorphs


    【解决方案1】:

    我想单表 Inberitance 和嵌套表单可能会帮助您。您可能想在文档中阅读它。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html

    【讨论】:

    • 我确实有用于单表继承的“类型”列。
    【解决方案2】:

    我发现答案在于使用 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| %>
    

    等等……

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 2016-07-24
        • 2023-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        相关资源
        最近更新 更多