سؤال

وكنت أتساءل ما هي أفضل طريقة لنموذج لعلاقة حيث يرتبط كائن مع بالضبط ن الأشياء من فئة أخرى. أود أن أتوجه العلاقة has_one إلى قيمة محددة ن.

وعلى سبيل المثال، فإن TopFiveMoviesList تنتمي إلى المستخدم ويكون بالضبط خمسة أفلام. أتصور أن الجدول SQL المصدر سيكون مجالات مثل movie_id_1، movie_id_2 ... movie_id_5.

وأنا أعلم أنني يمكن أن تفعل علاقة has_many والحد من عدد الأطفال على مستوى النموذج، ولكن أنا أفضل أن يكن لديك جدول وسيط.

هل كانت مفيدة؟

المحلول

وقائي الاول غريزة سيكون لاستخدام انضمام الجدول، ولكن إذا كان هذا لا أعمدة User.movie[1-5]_id المرغوب فيه أن صالح مشروع القانون. (على ما أظن movie1_id يناسب بشكل أفضل مع اتفاقية القضبان من movie_id_1).

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

class User < ActiveRecord::Base
  TOP_N_MOVIES = 5
  (1..TOP_N_MOVIES).each { |n|  belongs_to "movie#{n}".to_sym, :class_name => Movie }
end

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

وأنت قد تحتاج أيضا إلى إضافة التصديقات لضمان عدم وجود أفلام المكررة على قائمة المستخدم.

والربط الدرجة فيلم ظهرك للمستخدمين مشابه.

class Movie < ActiveRecord::Base

  (1..User::TOP_N_MOVIES).each do |n| 
    has_many "users_list_as_top_#{n}".to_sym, :class_name => User, :foreign_key => "movie#{n}_id"
  end

  def users_list_as_top_anything
    ary = []
    (1..User::TOP_N_MOVIES).each {|n| ary += self.send("users_list_as_top_#{n}") }
    return ary
  end

end

(وبطبيعة الحال أن users_list_as_top_anything ربما تكون مكتوبة بشكل أفضل من SQL كما صريح. أنا كسول اليوم).

نصائح أخرى

وأعتقد أن تنفيذ هذا النموذج من خلال الانضمام نموذج ستكون كنت أفضل رهان هنا. وهو يتيح للنموذج List للقلق حول قائمة المنطق ونموذج Movie ما يدعو للقلق منطق الفيلم. يمكنك إنشاء Nomination (الاسم ليس أعظم، ولكن هل تعرف ما أعنيه) نموذج للتعامل مع العلاقة بين الأفلام والقوائم، وعندما يكون هناك حد من 5، هل يمكن أن تحد من عدد الترشيحات عليك التراجع.

وهناك بضعة أسباب وأعتقد أن هذا النهج هو أفضل.

أولا، على افتراض انك تريد أن تكون قادرة على اجتياز العلاقات في كلا الاتجاهين (movie.lists وlist.movies)، ونهج العمود 5 سيكون الكثير من مسير.

وعلى الرغم انها تريد ان تكون أفضل بكثير لأكتيفيريكورد لدعم العلاقات has n، لم يحدث ذلك، وذلك عليك أن تقاتل الإطار على أن واحدا. أيضا، والعلاقة has n يبدو قليلا هشة لي في هذه الحالة. أنا لم أر هذا النوع من تنفيذ اقتلع في أكتيفيريكورد، على الرغم من أنني سأكون مهتما حقا في رؤية ذلك. :)

وأفترض أنك تعني "تنفيذ" بدلا من "نموذج"؟ النمذجة والسهل جدا في UML، ويقول، حيث لديك كيان الشخص الذي يتكون من 5 كيانات الفيلم.

ولكن يأتي من صعوبة عندما تقول has_one، والذهاب إلى has_5. اذا كان قيمة العددية البسيطة، has_one ربما خاصية على الكيان الأم. Has_5 هو على الارجح 2 كيانات مرتبطة ببعضها البعض من خلال "تتكون من" العلاقة في UML.

والسؤال الرئيسي للإجابة على الأرجح، "هل يمكنك أن تضمن أنه سيكون دائما" أعلى 5 "؟ إذا كانت الإجابة بنعم، نموذج مع الأعمدة، كما ذكرتم. إذا لا، نموذج مع كيان آخر.

وسؤال آخر هو ربما، "كيف سهلة سوف يكون لريفاكتور؟" لو كان بسيطا، هيك، وتبدأ مع 5 أعمدة وريفاكتور إلى كيانات منفصلة اذا غيرت من أي وقت مضى.

وكما جرت العادة، "أفضل" يعتمد على بيئة الأعمال والتقنية.

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