当列存在时,为什么我会得到未知列?

时间:2016-02-15 18:48:18

标签: mysql ruby-on-rails rspec rails-migrations

当运行我的照片规范#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

我有其中一天,我怀疑我在这里遗漏了一些非常明显的东西。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的测试数据库可能尚未应用迁移。您可以运行rake db:test:prepare将开发数据库模式复制到测试数据库,然后再次尝试运行测试。或者,您可以运行rake spec - 默认情况下,该命令将在运行任何测试之前准备您的测试数据库。