2017-03-05 9 views
0
class Program < ActiveRecord::Base 
has_many :contacts 

class Contact < ActiveRecord::Base 
belongs_to :program 

FactoryGirl.define do 
    factory :contact do 
    sequence(.... 
    ... 
    program_id 1 #foreign key 
    program  #association 

(byebug) contact 
Contact id: 949, display_name: "Contact-3", business_phone: "1234567894", fax_number: "1234567894", created_at: "2017-03-05 00:43:24", updated_at: "2017-03-05 00:43:24", first_name: "First-4", last_name: "Last-4", middle_initial: "4", email: "[email protected]", program_id: 1193, 287g: nil, active: true, call_office_id: 4 

Die program_id ist 1193 in der Kontaktdatensatz mit der Kontaktfabrik erstellt, aber die Programmtabelle hat nur vier Datensätze mit IDs 1-4. Nicht sicher, woher 1193 stammt. Zu diesem Zeitpunkt ist der rspec-Test mehr oder weniger erfolgreich. Aber sobald der folgende Validierungscode zum Kontaktmodell hinzugefügt wird, schlägt der rspec-Test fehl.firmgirl association validation

Kontakt Modell mit Verband Validierung hinzugefügt Für Programm

class ProgramValidator < ActiveModel::Validator 
    def validate(record) 
    if record.program.nil? 
     record.errors[:base] << "Program cannot be blank" 
    end 
    end 
end 

class Contact < ActiveRecord::Base 
    belongs_to :program 
    validates_with ProgramValidator 

Lauf rspec jetzt beklagt, dass „Programm nicht leer sein kann“. Frage: Wie kann die Kontaktfabrik erstellt werden, um die Validierung zu erfüllen? Warum sind Assoziationen so schwierig, viel schwieriger als das Erstellen der Assoziationen in ROR. Danke fürs Lesen.

Antwort

0

Dieses:

FactoryGirl.define do 
    program  #association 

neues Programm erstellt Datensatz, der als Assoziation angehängt ist (mit einer anderen ID, die auch 1193 oder eine andere ID sein kann).

Wenn Sie nicht möchten, dass ein neuer Programmdatensatz erstellt wird, lassen Sie program_id 1 nur in Ihrer Fabrikklasse. Denken Sie auch daran, dass Sie Ihre Tests in einer leeren Datenbank ausführen. Diese Factory-Klassendefinition funktioniert, wenn Sie beispielsweise vor Ihrer Testsuite einen Programmdatensatz erstellen und dessen ID explizit als 1 angeben.