السقالات أكتيفيريكورد: عمودين من نفس نوع البيانات
-
03-07-2019 - |
سؤال
وأساسي آخر القضبان السؤال:
ولدي جدول قاعدة البيانات التي تحتاج إلى تحتوي على مراجع بالضبط اثنين من السجلات مختلفة من نوع بيانات محددة.
ومثال افتراضي: أنا صنع قاعدة بيانات لعبة فيديو. لدي جدول ل "الشركات". أريد أن يكون بالضبط المطور واحدة وبالضبط ناشر واحد لكل إدخال "ألعاب الفيديو".
وأنا أعلم أنه إذا أريد أن يكون شركة واحدة، وأنا يمكن أن تفعل شيئا مثل:
script/generate Videogame company:references
ولكن أنا بحاجة إلى الشركتين. I تفضل عدم استخدام انضمام الطاولة، كما يمكن أن يكون هناك سوى اثنين بالضبط من نوع بيانات معينة، وأنا في حاجة إليها لتكون متميزة.
ويبدو أن الجواب يجب أن يكون واضحا جدا، ولكن أنا لا يمكن العثور عليه في أي مكان على شبكة الإنترنت.
المحلول
ولمجرد أن الأمور مرتبة قليلا، في الترحيل الخاص بك يمكنك الآن أيضا القيام به:
create_table :videogames do |t|
t.belongs_to :developer
t.belongs_to :publisher
end
ومنذ كنت تتصل مفاتيح developer_id وPUBLISHER_ID، وينبغي ان يكون نموذج:
belongs_to :developer, :class_name => "Company"
belongs_to :publisher, :class_name => "Company"
وانها ليست مشكلة كبيرة، ولكن أجد أنه مع عدد من الجمعيات بحجج إضافية الحصول على إضافة، تصبح الأمور أقل وضوحا، لذلك فمن الأفضل التمسك الافتراضية كلما أمكن ذلك.
نصائح أخرى
وليس لدي أي فكرة عن كيفية القيام بذلك مع النصي / تولد.
والفكرة الأساسية هي أسهل لإظهار دون استخدام النصي / تولد على أي حال. تريد حقلين في حياتك ألعاب الفيديو الجدول / نموذج التي تمسك مفاتيح خارجية لشركات الجدول / نموذج.
وسوف تظهر لك ما أنا <ط> التفكير رمز ستبدو، لكنني لم نجرب ذلك، لذلك قد أكون مخطئا.
وملف الهجرة الخاص بك على:
create_table :videogames do |t|
# all your other fields
t.int :developer_id
t.int :publisher_id
end
وبعد ذلك في النموذج الخاص بك:
belongs_to :developer, class_name: "Company", foreign_key: "developer_id"
belongs_to :publisher, class_name: "Company", foreign_key: "publisher_id"
ويمكنك أيضا أذكر يريد الشركتين أن تكون متميزة، والتي يمكن التعامل في التحقق من الصحة في النموذج الذي يتحقق أن developer_id != publisher_id
.
إذا كان هناك أي وسائل أو التحقق من صحة تريد محددة لنوع معين من الشركة، هل يمكن فرعية فئة نموذج الشركة. هذا يستخدم تقنية تسمى واحد الميراث الجدول. لمزيد من المعلومات راجع هذا المقال: http://wiki.rubyonrails.org/rails/pages/ singletableinheritance
ويمكنك عندئذ يكون لديك:
#db/migrate/###_create_companies
class CreateCompanies < ActiveRecord::Migration
def self.up
create_table :companies do |t|
t.string :type # required so rails know what type of company a record is
t.timestamps
end
end
def self.down
drop_table :companies
end
end
#db/migrate/###_create_videogames
class CreateVideogames < ActiveRecord::Migration
create_table :videogames do |t|
t.belongs_to :developer
t.belongs_to :publisher
end
def self.down
drop_table :videogames
end
end
#app/models/company.rb
class Company < ActiveRecord::Base
has_many :videogames
common validations and methods
end
#app/models/developer.rb
class Developer < Company
developer specific code
end
#app/models/publisher.rb
class Publisher < Company
publisher specific code
end
#app/models/videogame.rb
class Videogame < ActiveRecord::Base
belongs_to :developer, :publisher
end
ونتيجة لذلك، سيكون لديك شركة، المطور والناشر نماذج للاستخدام.
Company.find(:all)
Developer.find(:all)
Publisher.find(:all)