2012-04-22 5 views
3

Я относительно новичок в рельсах. Я пытаюсь установить связь «один ко многим» в рельсах. Однако, я думаю, что я делаю что-то не так с моей foreign_key, так как мой тест терпит неудачу. Мой тест заключается в следующем:Rails: неверный неверный номер один на один

В user_spec:

it {should have_many :invitations} 

модель Пользователь:

has_many :invitations 

пригласительные модель:

belongs_to :sender, :class_name => "User" 

Приглашение миграции:

class CreateInvitations < ActiveRecord::Migration 
    def change 
    create_table :invitations do |t| 
     t.integer :sender_id 
     t.string :token 

     t.timestamps 
    end 
    end 
end 

Я получаю ошибку из теста:

Failure/Error: it {should have_many :invitations} 
     Expected User to have a has_many association called invitations (Invitation does not have a user_id foreign key.) 

Я не уверен, где я неправильно. Есть идеи?

+0

t.integer: sender_id изменить на t.integer: user_id в процессе миграции – Fivell

+0

нормально, имеет смысл. Я получил эту часть перехода от ретрансляции. http://railscasts.com/episodes/124-beta-invitations , если я захочу сохранить: sender_id в процессе миграции (в случае, если я приношу recipient_id тоже ... как мне настроить свой код? – Karan

+0

Используйте ': foreign_key'. См. Мой ответ. – klump

ответ

3

Fivell является правильным. Вы просто использовали псевдоним для ассоциации с классом User. Либо измените имя столбца user_id или сказать рельсы использовать другой внешний ключ:

invitation.rb

belongs_to :sender, :class_name => "User" 

user.rb

has_many :invitations, :foreign_key => "sender_id" 
+0

это принесло ту же ошибку. Я добавил «: foreign_key =>« sender_id »... это не имело значения – Karan

+1

Я не ожидал, что это исправит ошибку, поскольку с помощью условных рельсов значение foreign_key = {association_name} _id – Karan

+0

Вы перезапустили сервер/консоль? И, как вы видите, рельсы искали в вас вопрос 'user_id'. Он принимает имя реальной ассоциации, а не псевдоним. – klump

4

Ошибка показывает, что проблема заключается не в in принадлежит_to, но в has_many

has_many :invitations , :foreign_key => "sender_id" 
+0

Спасибо, пропустил это. Я исправил свой ответ. – klump

+0

Это исправлено. Возможно, вопрос начинающих к рельсам, но не могли бы вы объяснить, почему я должен был бы добавить это, когда ключ приглашения уже знает, что внешний ключ отправителя является идентификатором отправителя? – Karan

+0

Нет, вы можете удалить его из 'приглашения.rb'. Вам просто нужно объявить его один раз, но в нужном месте. Вы указываете рельсы, чтобы связать пользователя со многими приглашениями, используя внешний ключ «sender_id». Это правильный путь. – klump

Смежные вопросы