سؤال

وأساسي آخر القضبان السؤال:

ولدي جدول قاعدة البيانات التي تحتاج إلى تحتوي على مراجع بالضبط اثنين من السجلات مختلفة من نوع بيانات محددة.

ومثال افتراضي: أنا صنع قاعدة بيانات لعبة فيديو. لدي جدول ل "الشركات". أريد أن يكون بالضبط المطور واحدة وبالضبط ناشر واحد لكل إدخال "ألعاب الفيديو".

وأنا أعلم أنه إذا أريد أن يكون شركة واحدة، وأنا يمكن أن تفعل شيئا مثل:

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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top