【问题标题】:issue with factory_girl , rpsec 2.0 and rails 3.0 => can't get has_one relation working nicely together!factory_girl 、 rpsec 2.0 和 rails 3.0 的问题 => 无法让 has_one 关系很好地协同工作!
【发布时间】:2010-10-13 23:08:44
【问题描述】:

我正在运行 rails 3.0、rspec 2.0 和 factory_girl。这是我正在使用的简化方案:用户一次只能订阅一个计划

# user.rb
class User < ActiveRecord::Base
  has_one :plan
  attr_accessible :login, :plan_id

end

# plan.rb
class Profile < ActiveRecord::Base
 attr_accessible :plan
end

# user_factory.rb
Factory.define :user do |u|
  u.login "test"
  u.association :plan
end

#plan_factory.rb
Factory.define :plan do |p|
   p.name "plan1"
end

当我运行 rspec spec/models/user_spec.rb 时出现此错误:

失败/错误:user = Factory(:user) SQLite3::ConstraintException: users.plan_id 可能不为 NULL

#spec/models/user_spec.rb
require File.dirname(__FILE__) + '/../spec_helper'

describe User do
  it "should be valid" do
    user = Factory(:user)
    #User.new.should be_valid
    user.should be_valid
  end
end

我做错了什么?我被这个非常简单的场景困住了,这非常令人沮丧。在那一点上,BDD 让我慢了下来!

【问题讨论】:

  • 你建立了你的测试数据库吗? rake db:test:prepare

标签: ruby-on-rails rspec factory-bot


【解决方案1】:

您似乎错误地实现了has_one 关联。 has_one -- belongs_to 关系中的外键应该放在与具有belongs_to 指令的模型对应的表中。检查db/schema.rb——我想你会发现plan_id是在users表中定义的。如果您希望User 模型有一个Plan,则需要从users 中删除plan_id 并将user_id 添加到plans

如果您希望让Plan 拥有一个User,请保持架构不变并将has_one :user 放入Plan 并将belongs_to :plan 放入User

【讨论】:

    【解决方案2】:

    用户订阅了一个计划。所以一个用户有一个计划,一个计划与许多用户相关。所以我认为我做对了。错误在用户工厂。 替换

    u.association :plan
    

    通过

    u.association :plan, :factory => :plan
    

    修复了问题。

    问题解决了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      相关资源
      最近更新 更多