我正在运行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让我慢慢下来!
答案 0 :(得分:0)
您似乎错误地实施了has_one
关联。 has_one -- belongs_to
关系中的外键应该放在与belongs_to
指令的模型对应的表中。检查db/schema.rb
- 我想您会发现plan_id
表中定义了users
。如果您希望User
模型有一个Plan
,则需要从plan_id
移除users
并将user_id
添加到plans
。
如果你想让Plan
有一个User
,请保持架构不变,并将has_one :user
放入Plan
和belongs_to :plan
User
。
答案 1 :(得分:0)
用户订阅了一个计划。因此,用户有一个计划,计划与许多用户相关。所以我认为我做对了。错误发生在用户工厂中。 取代
u.association :plan
通过
u.association :plan, :factory => :plan
解决了这个问题。
问题解决了!