Rails 2: Has_Many: Durch Validierung?
-
21-09-2019 - |
Frage
Rails 2.1.0 (aufgrund mehrerer Einschränkungen kann vorerst nicht ein Upgrade) Ich versuche dies zu erreichen. Irgendwelche Hinweise?
- Ein Projekt hat viele Benutzer durch das Tret -Modell
- Ein Benutzer hat viele Projekte durch das Join -Modell
- Die Administratorklasse erbt die Benutzerklasse. Es hat auch einige adminspezifische Sachen.
- Administrator wie Vererbung für Supervisor und Operator
- Das Projekt verfügt über einen Administrator, einen Supervisor und viele Betreiber.
Jetzt möchte ich 1. Daten für Projekt, Administrator, Supervisor und Betreiber in einem einzigen Projektformular einreichen. Validieren Sie alle und zeigen Sie Fehler im Projektformular an.
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
Ist der Ansatz korrekt? Alle Vorschläge sind willkommen.
Lösung 3
Am Ende habe ich virtuelle Attribute für Administrator, Supervisor und Betreiber verwendet. Alles andere ging durch Orm -Assoziationen
Andere Tipps
Ich denke, ein einzelner Tisch in Berberiten und verschachtelten Formularen kann Ihnen hier helfen. Möglicherweise möchten Sie in der Dokumentation darüber lesen. http://api.rubyonrails.org/classes/activerecord/base.html
Ich habe herausgefunden, dass die Antwort in einer einzelnen Tabelleererschaft mit Has_Many: durch
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
Jetzt können wir Folgendes haben
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
Eine komplexe Form, einschließlich all dieser, kann haben
<% 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| %>
usw...