سؤال

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

انتهى بي الأمر باستخدام سمات افتراضية للمسؤول والمشرف والمشغلين كل شيء آخر قد مر بجمعيات ORM

نصائح أخرى

أظن أن الجدول المفرد العنصري والأشكال المتداخلة قد تساعدك هنا. قد تريد أن تقرأ عنها في الوثائق. 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| %>

وهلم جرا...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top