it-swarm.dev

has_many ، ينتمي إلى علاقة في ترحيل سجل نشط Rails 4

لقد قمت بإنشاء نموذج User ثم نموذج Task. لم أذكر أي علاقة بينهما أثناء الخلق.

أنا أفهم أن Userhas_manyTasks و Taskbelongs_toUser. أحتاج إلى إقامة هذه العلاقة بينهما من خلال الهجرة.

سؤالي هو ، ماذا سيكون أمر توليد الهجرة لإقامة تلك العلاقة؟

أي مساعدة سيكون موضع تقدير كبير.

58
Hasan Iqbal

يمكنك الاتصال:

Rails g model task user:references

والتي ستنشئ عمود user_id في جدول tasks وستعدل نموذج task.rb لإضافة relatonship belongs_to :user. يرجى ملاحظة أنه يجب وضع العلاقة has_many :tasks أو has_one :task يدويًا مع طراز user.rb.

إذا كان لديك النموذج الذي تم إنشاؤه بالفعل ، فيمكنك إنشاء ترحيل باستخدام ما يلي:

Rails g migration AddUserToTask user:belongs_to

والتي سوف تولد:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end

الاختلاف الوحيد في هذا النهج هو ، لن يتم إنشاء علاقة belongs_to :user في نموذج task.rb تلقائيًا ، لذلك يجب عليك إنشاءها بنفسك.

72
Alter Lagos

للإجابة على السؤال ، "ماذا سيكون أمر توليد الترحيل لتأسيس تلك العلاقة؟" (بمعنى ، كيف تضيف ترحيلًا للنماذج الحالية ذات العلاقة مثل User has_many Tasks & Task belongs_to User)

أسهل طريقة لتذكرها هي:

>Rails g migration AddUserToTask user:belongs_to

أو

>Rails g migration AddUserToTask user:references

:belongs_to هو مجرد اسم مستعار لـ :references ، لذلك إما أن يفعل الشيء نفسه.

عند القيام بذلك بهذه الطريقة ، يستنتج الأمر اسم الجدول من اسم الترحيل ، ويقوم بإعداد طريقة تغيير تضيف عمود العلاقة ، وتهيئتها لفهرستها:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end

بعد توليد أنك:

>rake db:migrate

أخيرًا ، لا يزال يتعين عليك إضافة العلاقات المعتادة إلى النماذج الخاصة بك ، كما هو مذكور في الإجابات الأخرى ، لكنني أعتقد أن هذا هو الإجابة الصحيحة على سؤالك.

27
chad_

كيف ينبغي القيام به عند إنشاء الترحيل في المقام الأول:

Rails g scaffold child parent:references


ماذا تفعل إذا كنت قد نسيت parent:references bit:

إذا لم يكن لديك بالفعل الكثير المحدد في النموذج/ديسيبل عن الطفل. قد يكون أفضل رهان هو تشغيل Rails destroy scaffold child ، ثم تشغيل Rails g scaffold child parent:references فوقه. تأكد من إضافة السطر drop_table :children if table_exists? :children قبل إنشاء جدول في الملف الذي ينشئ الجدول الجديد. (وبهذه الطريقة ، إذا قام أي شخص بسحب الكود الخاص بك ، فيمكنه فقط تشغيل عمليات الترحيل وتنفيذها.) ومع ذلك ، يبدو أنه من المحتمل أن يكون لديك بيانات لا تريد أن تفقدها في النموذج الفرعي بالفعل.


في هذه الحالة:

Rails g migration add_parent_refs_to_child

## XXXXXXXXXXXXXX_add_parent_refs_to_child.rb
class AddParentRefsToChild < ActiveRecord::Migration
  def change
    add_reference :child, :parent, index: true
  end
end

انظر add_reference لمزيد من التفاصيل.

لا تنسَ أيضًا التأكد من أن النموذج الأصل has_[one | many] :children وأن النموذج التابع belongs_to :parent.


كيف لا تفعل ذلك:

قد يغريك مجرد الدخول وإضافة الوالد يدويًا ، ويمكنك بالتأكيد أن هذا ليس هو الحل الأفضل لأنه ليس الطريقة التقليدية للذهاب لإضافة مفاتيح خارجية ، ولا يضفي صفة جيدة على قابلية الصيانة أو القراءة . اتفاقية على التكوين!

يحتوي دليل روبي أون ريلز على الارتباط أيضًا على مزيد من المعلومات المفيدة حول هذا الموضوع.

16
0112

لا يوجد أمر ترحيل خاص يمكن استخدامه.

في نموذج المستخدم الخاص بك سوف تضع

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

في ملف الترحيل المناظر للمهام التي قمت بإضافتها ، أضاف الحقل التالي user_id

إلقاء نظرة على هذا دليل

5
Althaf Hameez

يتم الاهتمام بالعلاقة في القضبان حسب النموذج وليس عن طريق القضبان.

لذلك تحتاج فقط إلى تحديد هذه العلاقة في النموذج الخاص بك:

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

وتأكد فقط من وجود حقل user_id في الترحيل لإنشاء جدول "المهام".

4
Amitkumar Jha

ستضيف عملية الترحيل معرف المستخدم إلى جدول المهام حتى يعرفوا بعضهم البعض

Rails g migration AddUserIdToTask user_id:integer

ثم

rake db:migrate

وبعد تحديث وحدات التحكم الخاصة بك وجهات النظر بحيث لا يمكن إنشاء المهام من تلقاء نفسها ولكن يجب أن تتوافق مع المستخدم

4
Connor Leech