I denne artikel vil vi gennemgå, hvordan man genererer data for has_one, has_many og polymorfe associationer ved hjælp af FactoryGirl. Hver association vil blive beskrevet med et eksempel, så du kan få en idé om, hvordan du kan oprette mere komplekse fabrikker uden smerte.
Generering af data for has_one association
Det er ret nemt at opsætte has_one association, du kan definere den i fabrikken. Hvis fabriksnavnet er det samme som associationsnavnet, kan fabriksnavnet udelades. For eksempel:
FactoryBot.define do factory :story do # story attributes author endend
Du kan også angive en anden fabrik og tilsidesætte attributter:
FactoryBot.define do factory :story do # story attributes association :author, factory: :user, first_name: "Jon" endend
Det er muligt at angive forskellige strategier for oprettelse af foreningen:
association :author, factory: :user, strategy: :build
Husk, at dette ikke gemmer et associeret objekt i databasen.
Generering af data for has_many-forbindelse
Generering af data for en has_many-forbindelse er en smule mere kompliceret. Du kan definere en ny fabrik og bruge after(:create) callback til at oprette en liste over foreninger. Lad os se, hvordan du gør det i dette eksempel:
FactoryBot.define do # user factory without associated stories factory :user do # user attributes factory :user_with_stories do transient do stories_count 10 end after(:create) do |user, evaluator| create_list(:stories, evaluator.stories_count, user: user) end end endend
Attribut stories_count er en transient og tilgængelig i attributterne i fabrikken og i callback’et via evaluator. Nu kan du oprette en bruger med historier med mulighed for at angive, hvor mange historier vi ønsker:
create(:user_with_stories).stories.length # 10create(:user_with_stories, stories_count: 15).stories.length # 15
Bemærk, at hver historie vil have et unikt id, men for at andre attributter skal være unikke, skal du generere forskellige værdier for hver historie.
Det kan du opnå ved at bruge sekvensen som eksempel:
FactoryBot.define do factory :story do # story attributes sequence(:title) { |n| "Title#{n}" } # Unique title for every story association :author, factory: :user, first_name: "Jon" endend
Der findes også en interessant perle, der kan hjælpe dig med at generere unikke værdier kaldet faker.
Generering af data for polymorfe foreninger
En polymorf forening kan være en smule forvirrende. Forhåbentlig vil dette eksempel hjælpe dig med at forstå det bedre. Lad os sige, at du har følgende klasser med polymorfe associationer:
class Profile belongs_to :profileable, polymorphic: trueendclass Account belongs_to :accountable, polymorphic: trueendclass User has_one :profile, as: :profileable has_one :account, as: :accountableend
Når du opretter fabrikkerne for de modeller, der har den polymorfe model, opretter du blot den polymorfe model i en efter(:create)-blok og angiver, at den polymorfe model er den model, som fabrikken er til:
FactoryBot.define do factory :user, class: User do # user attributes after(:create) do |user| create(:account, accountable: user) create(:profile, profileable: user) end endend
Og… det er det! Tak for at du læste denne artikel. Hvis du er interesseret i at læse flere interessante artikler om Rails, skal du sørge for at abonnere på vores nyhedsbrev! Interesserer du dig for lignende emner? Husk at tjekke vores bud på Rspec let vs før, Rspec Setup og FactoryGirl – create vs build vs buldstubbed.