Подтвердить что ты не робот

Как пользователь factory девушка создает связанные списки с has_many с проверкой, которая требует ее создания

В приложении Rails задайте три модели User, Article и Reviewer со следующими отношениями и проверками:

class User < ActiveRecord::Base
  has_many :articles
  has_many :reviewers
end

class Reviewer < ActiveRecord::Base
  belongs_to :user
  belongs_to :article
end

class Article < ActiveRecord::Base
  belongs_to :user
  has_many :reviewers

  validate :has_reviewers?

  def has_reviewers?
    errors.add(:base, "article must have at least one reviewer.") if self.reviewers.blank?
  end
end

И следующие заводы, использующие новый DSL:

FactoryGirl.define do

  factory :user do
    name { (8...20).map{ ('a'..'z').to_a[rand(26)] }.join }
    age  { Kernel.rand(100) }
  end

  factory :article do
    body "This is the article content"
    title "This is the title"
    user
    after_create do |article|
      article.reviewers = create_list(:user, 2)
    end
  end

  factory :reviewer do
    user
    article
    state { ["published","draft","rejected","archived"][Kernel.rand(4)] }
  end

end

factory для создания статьи не работает, потому что проверка не выполняется до создания рецензентов:

> FactoryGirl.create(:article)
ActiveRecord::RecordInvalid: Validation failed: article must have at least one reviewer.

Я сделал больше попыток, чем хотел бы признать попытку преодолеть это препятствие, но я застрял! Одна из моих идей заключалась в том, чтобы создать таких рецензентов, как это:

  factory :article do
    body "This is the article content"
    title "This is the title"
    user
    reviewers {|a| [FactoryGirl.create(:reviewer, article: a)] }
  end

но в этом контексте "a" не является экземпляром. Так что это тоже не работает, как и раньше.

4b9b3361

Ответ 1

Я переписал это на странице Factory Girl github как проблему и проделал свой путь к ответу:

before_create do |article|
  article.reviewers << FactoryGirl.build(:reviewer, article: article)
end

Ключ делал это в файле before_create, поэтому проверки еще не уволились, и убедитесь, что он снова нажал вновь созданного рецензента в список отзывов о создаваемом экземпляре. Спасибо Unixmonkey за то, что я ответил и попробовал новые вещи:)

https://github.com/thoughtbot/factory_girl/issues/369#issuecomment-5490908

Ответ 2

factory :article do
  reviewers {|a| [a.association(:reviewer)] }
end

или

factory :article do
  before_create do |a|
    FactoryGirl.create(:reviewer, article: a)
  end
end

Ответ 3

Новый синтаксис:

before(:create) do |article|
  article.reviewers << FactoryGirl.build(:reviewer, article: article)
end