在给定的情况下,用户可以:
- 邀请许多受邀者(has_many:邀请)
- 接受一个邀请(has_one:邀请)
根据http://guides.rubyonrails.org/association_basics.html#the-has_many-through关联has_many:through关联应该允许我使用类似以下功能测试中的快捷方式。
然而,它失败了,并在评论中指出了错误。
功能测试片段:
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)
邀请函的相关部分。rb:
belongs_to :issuer, :class_name => "User"
belongs_to :invitee, :class_name => "User"
validates_presence_of :issuer
validates_presence_of :invitee
用户的相关部分。rb:
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'
表示用户作为发布者发送了邀请。