проблема с factory_girl, rpsec 2.0 и rails 3.0 => не может заставить отношения has_one работать вместе! - PullRequest
0 голосов
/ 14 октября 2010

Я использую рельсы 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, я получаю эту ошибку:

Ошибка / Ошибка: пользователь = Завод (: пользователь) 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 замедляет меня, как ад!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

Пользователь подписывается на один план.таким образом, у пользователя есть один план, и план связан со многими пользователями.Так что я думаю, что понял это правильно.ошибка была в пользовательской фабрике.замена

u.association :plan

на

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

исправила проблему.

Проблема решена!

0 голосов
/ 14 октября 2010

Похоже, вы неправильно установили ассоциацию 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.

...