سؤال

في حالة معينة يجوز للمستخدم:

  • دعوة العديد من المدعوين (لدي_العديد :الدعوات)
  • قبول دعوة واحدة (لديه واحد :دعوة)

وفقا ل http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association a له_العديد: من خلال يجب أن يسمح لي الارتباط باستخدام اختصار مثل الاختصار الموجود في الاختبار الوظيفي التالي.

ومع ذلك ، فإنه يفشل مع الخطأ المشار إليه في التعليق.

مقتطف من اختبار وظيفي:

assert_difference('Invitation.count') do # WORKS
  post :create, :user => { :email => invitee_email, :password => "1password" }
end

@invitee = User.find_by_email(invitee_email)
@invitation = Invitation.find_by_issuer_id_and_invitee_id(@issuer.id, @invitee.id)
assert @invitation.valid? # WORKS
assert_present @invitation.issuer # WORKS
assert_present @invitation.invitee # WORKS

# TODO: repair
assert_present @issuer.invitees # FAILS with "[] is blank"
assert_present @invitee.issuer # FAILS with "nil is blank"

مقتطف من الطريقة قيد الاختبار:

@issuer.create_invitation(:invitee => @invitee, :accepted_at => Time.now)
# tested as well - also fails the test:
# Invitation.create!(:issuer => @issuer, :invitee => @invitee, :accepted_at => Time.now)

الأجزاء ذات الصلة من الدعوة.الميزانية العادية:

belongs_to :issuer, :class_name => "User"
belongs_to :invitee, :class_name => "User"

validates_presence_of :issuer
validates_presence_of :invitee

الأجزاء ذات الصلة من المستخدم.الميزانية العادية:

has_many :invitations, :foreign_key => 'invitee_id', :dependent => :destroy
has_many :invitees, :through => :invitations
has_one :invitation, :foreign_key => 'issuer_id', :dependent => :destroy
has_one :issuer, :through => :invitation

الآن أتساءل:

  • ما هو الصحيح 'اختصار'?
  • هل تم إعداد نماذجي بشكل صحيح في المقام الأول?
هل كانت مفيدة؟

المحلول

أعتقد أنك تحاول تصميم المنطق مثل هذا:المستخدم 1 يمكن دعوة المستخدم 2 ، المستخدم 3 ، ثم البيانات:

issuer_id, invitee_id
1,         2
1,         3

افترض أن المستخدم 2 قبل الدعوة ، تصبح البيانات:

issuer_id, invitee_id
1,         2
1,         3
2,         1

ماذا لو المستخدم 2 تدعو المستخدم 1 في وقت لاحق?إذا كان تخميني هو الصحيح ، فإن التصميم الخاص بك لا تعمل.

أعتقد أن لديك أيضا بعض سوء الفهم حول الجمعيات. has_many :invitations, :foreign_key => 'invitee_id' يعني أن المستخدم ، كمدعو ، تلقى العديد من الدعوات.و has_one :invitation, :foreign_key => 'issuer_id' يعني أن المستخدم ، كمصدر ، أرسل دعوة.

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