铁路2:has_many:通过验证?
-
21-09-2019 - |
题
Rails 2.1.0(由于几个约束,目前无法升级)我正在尝试实现这一目标。有提示吗?
- 一个项目通过加入模型有许多用户
- 用户通过加入模型有许多项目
- 管理类继承用户类。它还具有一些管理特定的内容。
- 管理员和管理者的继承类似
- 项目有一名管理员,一名主管和许多运营商。
现在,我要1.在单个项目表2中提交项目,管理员,主管和运营商的数据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
我最终使用了管理员,主管和运营商的虚拟属性
其他提示
我猜单个表格和嵌套表格可能会在这里为您提供帮助。您可能想在文档中阅读有关它的信息。 http://api.rubyonrails.org/classes/activerecord/base.html
我发现答案在于用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| %>
等等...
不隶属于 StackOverflow