القضبان 2: HAS_MANY: من خلال التحقق من الصحة؟
-
21-09-2019 - |
سؤال
Rails 2.1.0 (لا يمكن الترقية في الوقت الحالي بسبب عدة قيود) أحاول تحقيق ذلك. أي تلميحات؟
- يحتوي المشروع على العديد من المستخدمين من خلال نموذج الانضمام
- لدى المستخدم العديد من المشاريع من خلال نموذج الانضمام
- فئة المسؤول يرث فئة المستخدم. كما أن لديها بعض الأشياء المحددة للمسؤول.
- المسؤول مثل الميراث للمشرف والمشغل
- المشروع لديه مسؤول واحد ومشرف واحد والعديد من المشغلين.
الآن أريد 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| %>
وهلم جرا...
لا تنتمي إلى StackOverflow