0

すべてのファクトリについて、ディスクからイメージをロードするUser入れ子を作成する必要があります。Photoファイル名をユーザー ファクトリの属性として宣言するだけで、このコードを単純化するにはどうすればよいでしょうか。

このコードにも問題があり、おそらく後の最初のユーザーのために、 :women factory ファイル名をavatar1.jpgではなくとして保存しています。avatar2.jpg

FactoryGirl.define do
  factory :user do
    email 'john@site.com'
    country 'US'

    after(:create) do |user, evaluator|
      photo_file = 'avatar1.jpg'
      photo_object = File.new(File.join(::Rails.root.to_s, "/factories/images", photo_file), 'rb')
      user.photos << FactoryGirl.build(:photo, photo: photo_object, user: user)
      user.avatar_id = user.photos.first.id
      user.save
    end

    factory :woman do
      email 'annie@site'
      after(:create) do |user, evaluator|
        photo_file = 'avatar2.jpg'
        photo_object = File.new(File.join(::Rails.root.to_s, "/factories/images", photo_file), 'rb')
        user.photos << FactoryGirl.build(:photo, photo: photo_object, user: user)
        user.avatar_id = user.photos.first.id
        user.save
      end
    end

  end
end

これがモデル関係

# user.rb
has_many :photos, dependent: :destroy

# photo.rb
belongs_to :user

何か助けはありますか?

4

2 に答える 2

1

Photoコードをより適切に編成する方法に関する提案として、ファイル読み取りロジックをモデル自体に移動する必要があります。例えば:

class Photo < ActiveRecord::Base
  attr_accessor :filename

  after_initialize do |p|
    if filename
      p.photo = File.new(File.join(::Rails.root.to_s, filename), 'rb')
    end
  end
end

次に、特性を使用して、次のようにcreate(:user, :male)とを使用して、男性と女性のユーザーを作成できます。create(:user, :female)

FactoryGirl.define do
  factory :user do
    country 'US'

    ignore { photo_count 1 }    # ignored attribute - number of photos to build per user

    trait :male do
      email 'john@site.com'

      after(:create) do |user, evaluator|
        create_list(:photo, evaluator.photo_count, :male, user: user)
      end
    end

    trait :female do
      email 'annie@site.com'

      after(:create) do |user, evaluator|
        create_list(:photo, evaluator.photo_count, :female, user: user)
      end
    end
  end

  factory :photo do
    trait :male do
      filename '/factories/images/avatar1.jpg'
    end

    trait :female do
      filename '/factories/images/avatar2.jpg'
    end

    user # the user to be associated with the photo
  end
end
于 2012-11-28T18:39:43.660 に答える
0

正確にはエレガントな解決策ではありませんが、簡単な修正は作ることです

user.avatar_id = user.photos.last.id
于 2012-11-28T18:01:00.980 に答える