Почему этот ярлык ассоциации Rails терпит неудачу?Какой правильный путь? - PullRequest
0 голосов
/ 13 марта 2012

В данном случае Пользователь может:

  • пригласить много приглашенных (has_many: приглашения)
  • принять одно приглашение (has_one: приглашение)

Согласно http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association a has_many: через ассоциация должна позволить мне использовать ярлык, подобный тому, который приведен в следующем функциональном тесте.

Однако, это терпит неудачу с ошибкой, отмеченной в комментарии.

фрагмент из функционального теста:

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

соответствующие части user.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 Ответ

0 голосов
/ 13 марта 2012

Я полагаю, вы пытаетесь спроектировать логику следующим образом: пользователь 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' означает, что пользователь как эмитент отправил приглашение.

...