FactoryGirl ActiveRecord :: RecordInvalid:验证失败:名称已被采用

时间:2014-05-14 07:45:13

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

我有三种模式,课程,类别和合作伙伴,一门课程可以有很多类别,一门课程属于一个合作伙伴。当我创建我的课程工厂时,我收到以下错误:

Partner has a valid factory for course
     Failure/Error: expect(FactoryGirl.create(:course)).to be_valid
     ActiveRecord::RecordInvalid:
       Validation failed: Name has already been taken 

以下是我的模特:

class Category < ActiveRecord::Base
  has_many :categorisations 
  has_many :courses, :through=> :categorisations
  belongs_to :user
#validation 
  validates :name, presence: true , uniqueness: { scope: :name }
end


class Partner < ActiveRecord::Base
  has_many :courses
  belongs_to :user

  validates :name, presence: true, uniqueness: { scope: :name }
  validates :short_name, presence: true
  VALID_HEX_COLOR= /\A#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\z/
  validates :primary_color, presence: true, format: { with: VALID_HEX_COLOR}
  validates :secondary_color, presence: true, format: { with: VALID_HEX_COLOR}
end

class Course < ActiveRecord::Base
  extend FriendlyId
  friendly_id :title, use: [:slugged, :history]

  has_many :categorisations, :dependent => :destroy
  has_many :categories, :through=> :categorisations 
  belongs_to :partner
  belongs_to :user

  # validates_uniqueness_of :title
  validates :title, presence: true
  # validates :start_date, presence: true
  # validates :duration, presence:true
  # validates :state, presence:true
  validates :categories, length: { minimum: 1 , message:"please select"}
  validates :partner_id, presence: true, allow_nil: false
end

这是我的工厂:

 factory :partner do |f|
    f.name Faker::Name.name
    f.short_name "UCT"
    f.primary_color "#009bda"
    f.secondary_color "#002060"
  end

factory :course do |f|
    f.title "Introduction to Accounting short course"
    f.start_date "2014-02-27 00:00:00"
    f.duration "10 WEEKS ONLINE"
    partner
    categorisation
  end  
  factory :categorisation do |categorisation|
    categorisation.category {|category| category.association(:category)}
    categorisation.course {|course| course.association(:course)}
  end

我不确定我做错了什么,如果有人可以告诉我问题可能是什么,或者我可以解决这个问题的过程可能会有很大的帮助

2 个答案:

答案 0 :(得分:1)

试试这个:

 factory :partner do |f| 
    f.sequence(:name) { |n| "#{Faker::Name.name} #{n}" }
    f.short_name "UCT"
    f.primary_color "#009bda"
    f.secondary_color "#002060"
  end

  factory :category do |f| 
    f.sequence(:name) { |n| "Category #{n}" }
  end

答案 1 :(得分:0)

我所要做的就是将以下一行添加到我的课程工厂:

categories {[FactoryGirl.create(:category)]}

couse factory:

factory :course do |f|
    f.title "Introduction to Accounting short course"
    f.start_date "2014-02-27 00:00:00"
    f.duration "10 WEEKS ONLINE"
    partner
    categories {[FactoryGirl.create(:category)]}
  end