factory_girl has_many: через проверки

У меня есть следующие модели:

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

Я не могу создать фабрику :activity, так как получаю сообщение об ошибке проверки "Activity не может быть пустым".

Мои заводы выглядят так:

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

Я получаю сообщение об ошибке, когда запускаю эту фабрику в своей спецификации: @activity = Factory(:activity)

ПОЖАЛУЙСТА ПОМОГИ!


person Coderama    schedule 24.09.2010    source источник
comment
Клиентская поддержка? Я бы выбрал ClientActivity... звучит более естественно.   -  person Andrew Vit    schedule 24.09.2010


Ответы (1)


Что я всегда делаю в таких случаях, это что-то вроде:

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

Итак, в моих тестах/спецификациях я использую

Factory :clientship

Может быть, это не так чисто, но для меня это имеет гораздо больше смысла... Однако я не уверен, что создание такого отношения из таблицы соединений - такая хорошая идея.

И, вообще, я предпочитаю создавать ассоциации на фабриках со стороны belongs_to, так как в конце концов это становится для меня менее проблематичным.

person Fran    schedule 24.09.2010
comment
Спасибо за Ваш ответ. Я также делаю что-то похожее на метод, который вы описываете. Единственной проблемой в этом случае является ошибка проверки в модели Activity... - person Coderama; 24.09.2010
comment
Да, вы используете аналогичный способ, но здесь a.clientships { |cs| [cs.association :clientship] } вы создаете клиента с фабрикой по умолчанию, которая не включает активность. Вот почему вы получаете ошибку проверки. Вам нужно создать активность перед созданием клиенша, вы делаете это наоборот. - person Fran; 24.09.2010