Coderama
Coderama

Reputation: 11352

factory_girl has_many :through with validations

I have the following models:

class Activity < ActiveRecord::Base
  has_many  :clientships, :dependent => :destroy
  has_many  :clients, :through => :clientships
end

class Clientship < ActiveRecord::Base
  belongs_to  :client
  belongs_to  :activity

  validates_presence_of :client_id
  validates_presence_of :activity_id, :unless => :new_record?
end

class Client < ActiveRecord::Base
  has_many  :clientships
  has_many  :activities, :through => :clientships
end

I can't create an :activity factory as I get the validation error "Activity can't be blank".

My factories look like this:

Factory.define :activity do |a|
  a.association :staff, :factory => :user
  a.clientships { |cs| [cs.association :clientship] }
end

Factory.define :clientship do |cs|
  cs.association(:client)
end

Factory.define :client do |c|
  c.first_name {Factory.next(:name)}
  c.last_name {Factory.next(:name)}
end

I am getting the error when I run this factory in my spec: @activity = Factory(:activity)

PLEASE HELP!

Upvotes: 1

Views: 2136

Answers (1)

Fran
Fran

Reputation: 1073

What I always do in cases like that is something like:

Factory.define :activity do |a|
  #whatever attributes
end

Factory.define :clientship do |cs|
  cs.association(:client)
  cs.association(:activity)
end

Factory.define :client do |c|
  c.first_name {Factory.next(:name)}
  c.last_name {Factory.next(:name)}
end

So in my tests/specs I use

Factory :clientship

Maybe it's not so clean, but makes much more sense to me... However I'm not sure that creating such a relationshipt from the join table is such a good idea.

And, in general I prefeer to create the associations in the factories from the belongs_to side since at the end it results being less problematic to me.

Upvotes: 3

Related Questions