Frage

Rails 2.1.0 (aufgrund mehrerer Einschränkungen kann vorerst nicht ein Upgrade) Ich versuche dies zu erreichen. Irgendwelche Hinweise?

  1. Ein Projekt hat viele Benutzer durch das Tret -Modell
  2. Ein Benutzer hat viele Projekte durch das Join -Modell
  3. Die Administratorklasse erbt die Benutzerklasse. Es hat auch einige adminspezifische Sachen.
  4. Administrator wie Vererbung für Supervisor und Operator
  5. 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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top