Rails 2: has_many: через проверку? - PullRequest
0 голосов
/ 22 марта 2010

Rails 2.1.0 (на данный момент невозможно выполнить обновление из-за нескольких ограничений) Я пытаюсь достичь этого. Есть намеки?

  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

Правильный ли подход? Любые предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 25 марта 2010

Я понял, что ответ заключается в наследовании одной таблицы с помощью 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| %>

и так далее ...

0 голосов
/ 04 мая 2010

Я использовал виртуальные атрибуты для администратора, супервизора и операторов. все остальное прошло через ассоциации ORM

0 голосов
/ 22 марта 2010

Полагаю, что здесь могут помочь однобитное наследование и вложенные формы. Вы можете прочитать об этом в документации. http://api.rubyonrails.org/classes/ActiveRecord/Base.html

...