Следует ли Matcher не может найти иностранный идентификатор
У меня есть такой тест:
require 'rails_helper'
RSpec.describe User, :type => :model do
it { should have_many(:assignments) }
it { should have_many(:roles).through(:assignments) }
end
Который возвращает эту ошибку:
Failure/Error: it { should have_many(:assignments) }
Expected User to have a has_many association called assignments (Assignment does not have a user_id foreign key.)
Однако моя схема выглядит так:
create_table "assignments", force: true do |t|
t.integer "user_id"
t.integer "role_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Мои модели выглядят так:
user.rb
require 'role_model'
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :first_name, presence: true
validates :last_name, presence: true
validates :password, length: { minimum: 8 }
include RoleModel
roles_attribute :roles_mask
roles :admin, :super_admin, :user
has_many :assignments
has_many :roles, :through => :assignments
end
здесь assignment.rb
class Assignment < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
Есть идеи, что я здесь делаю не так?
2 ответа
Решение
Я ничего не изменил, и ошибка просто ушла через день. Я предполагаю, что что-то немного не синхронизировалось, но теперь все в порядке.
Попробуйте выполнить миграцию с помощью более стандартных "ссылок" (а не только целых):
create_table "assignments", force: true do |t|
t.references "user", index: true
t.integer "role_id"
t.datetime "created_at"
t.datetime "updated_at"
end
Или вы в два-три раза уверены, что вы выполнили свои миграции? Иногда вам нужно запускать их и для ваших тестов (если вы запускаете отдельную спецификацию rspec, а не запускаете их все с использованием rake). если сомневаешься: rake db:test:prepare