当运行我的照片规范#star时,我不确定为什么当列实际存在时,我收到stars.user_id的未知列错误。该操作在rails控制台和浏览器中工作正常,因为@ user.starred_photos实际上已被修改。
我已经检查了mysql中的数据库模式,列就在那里。我已经尝试回滚迁移并重做它以及重新启动服务器。这是错误:
Failure/Error:
expect{
post :star, id: photo
}.to change{ @user.starred_photos.count }.from(0).to(1)
ActiveRecord::StatementInvalid:
Mysql2::Error: Unknown column 'stars.user_id' in 'where clause': SELECT COUNT(*) FROM `photos` INNER JOIN `stars` ON `photos`.`id` = `stars`.`photo_id` WHERE `stars`.`user_id` = 1
控制器规格&动作
# spec/controllers/photos_controller_spec.rb
describe '#POST star' do
it "adds the given photo to the user's starred photos" do
sign_in_as_user
other_user = create(:user)
photo = other_user.photos.create(attributes_for(:photo))
expect{
post :star, id: photo
}.to change{ @user.starred_photos.count }.from(0).to(1)
end
end
#app/controllers/photos_controller.rb
def star
current_user.starred_photos << @photo
end
模型
# app/models/star.rb
class Star < ActiveRecord::Base
belongs_to :user
belongs_to :photo
end
# app/models/user.rb
class User < ActiveRecord::Base
has_many :photos
has_many :stars
has_many :starred_photos, through: :stars, source: :photo
# app/models/photo.rb
class Photo < ActiveRecord::Base
belongs_to :user
has_many :stars
has_many :starring_users, through: :stars, source: :user
架构
# db/schema.rb
create_table "stars", force: :cascade do |t|
t.integer "photo_id", limit: 4
t.integer "user_id", limit: 4
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我有其中一天,我怀疑我在这里遗漏了一些非常明显的东西。提前谢谢!
答案 0 :(得分:1)
您的测试数据库可能尚未应用迁移。您可以运行rake db:test:prepare
将开发数据库模式复制到测试数据库,然后再次尝试运行测试。或者,您可以运行rake spec
- 默认情况下,该命令将在运行任何测试之前准备您的测试数据库。