2016-04-27 3 views
1

Ich habe ein Day-Modell, und ein Tag-Modell kann viele time_slots haben.Rails Fabrik Mädchen, wie kann ich eine Fabrik für diesen Satz von zugehörigen Modellen

Der Tag Modell sieht wie folgt aus:

# == Schema Information 
# 
# Table name: days 
# 
# id   :integer   not null, primary key 
# schedule_id :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# wday  :integer 
# 

class Day < ActiveRecord::Base 
    belongs_to :schedule 
    has_many :time_slots, :dependent => :destroy 
end 

Timeslot Modell sieht wie folgt aus:

# == Schema Information 
# 
# Table name: time_slots 
# 
# id   :integer   not null, primary key 
# day_id  :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# pin   :string 
# start_hour :integer 
# start_minute :integer 
# end_hour  :integer 
# end_minute :integer 
# 

class TimeSlot < ActiveRecord::Base 
    belongs_to :day 
    has_many :passes, :dependent => :destroy 

    validates :start_hour, :presence => true 

    validates :start_minute, :presence => true 

    validates :end_hour, :presence => true 

    validates :end_minute, :presence => true 
end 

ich folgende Fabrik für Tag Zeit haben:

# == Schema Information 
# 
# Table name: days 
# 
# id   :integer   not null, primary key 
# schedule_id :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# wday  :integer 
# 

FactoryGirl.define do 
    factory :day do 
    wday rand(0..6) 

    after(:create) do |day, evaluator| 
     create_list(:time_slots, 2, day: day,start_hour: generate :start_hour, start_min: generate :start_min, end_hour: generate :end_hour,end_min: generate :end_min) 
    end 

    end 

    sequence :start_hour do |n| 
    #Needs to return something between 00 and 23 
    n 
    end 

    sequence :start_min do |n| 
    #Needs to return something between 00 and 55 
    n 
    end 

    sequence :end_hour do |n| 
    #Needs to return something between 00 and 23 but a value HIGHER than start_hour 
    #If end_min == start_min 
    n 
    end 

    sequence :end_min do |n| 
    #Needs to return something between 00 and 55 but a value that is definitely after start_min if end_hour and start_hour are equal 
    n 
    end 



end 

Grundsätzlich - Mein Tag muss time_slots haben, die sinnvoll sind, dh ein Tag könnte das folgende haben, das gültig sein würde :

Timeslot 1 
start_hour : 10 
start_min : 00 
end_hour : 11 
end_min : 00 

Timeslot 2 
start_hour : 11 
start_min : 00 
end_hour : 12 
end_min : 00 

Dies würde jedoch keine Gültigkeit als Zeitschlitz 2 mit Zeitschlitz überlappt 1. Ebenso 2 identisch time_slots sind nicht gültig:

Timeslot 1 
start_hour : 10 
start_min : 00 
end_hour : 11 
end_min : 00 

Timeslot 2 
start_hour : 10 
start_min : 30 
end_hour : 11 
end_min : 00 

Es scheint Sequenzen der Lage sein, mich hier zu helfen ... das wäre einfach, wenn ich eine 'globale' Menge von Startmins, Startstunden usw. hätte, da ich einfach die nächste aus dem Array auswählen könnte, aber ich weiß nicht, ob das möglich ist oder ob es einen besseren Weg gibt?

Bitte helfen!

Antwort

1

Eigentlich glaube ich, dass ich factory_girl dafür nicht verwenden würde. Stattdessen würde ich sichtbar meine Timeslots in den Tests erstellen.

Aber Sie mit diesem gehen könnten:

sequence :start_hour do |n| 
    #Needs to return something between 00 and 23 
    raise 'No more timeslots available' if n == 24 
    n - 1 # if factory_girl starts with 1 
end 

sequence :start_min do |n| 
    #Needs to return something between 00 and 55 
    0 # Just always zero 
end 

sequence :end_hour do |n| 
    #Needs to return something between 00 and 23 but a value HIGHER than start_hour 
    #If end_min == start_min 
    n - 1 
end 

sequence :end_min do |n| 
    #Needs to return something between 00 and 55 but a value that is definitely after start_min if end_hour and start_hour are equal 
    55 # like always 55 minute slots 
end 

Also im Grunde kann man mit den n rumspielen.

Ich hoffe factory_girl ist konsistent mit der n s. Andernfalls könnten Sie eine größere Schleife mit der n versuchen.

+0

also was ist n ... eine Nummer? Erhöht es nicht? Reduziert n-1 n nicht um 1 ... was bedeutet, dass start_hour und end_hour immer noch gleich sein können? Ist n global über alle Sequenzen hinweg so garantiert einzigartig für alle Sequenzgeneratoren? – RenegadeAndy

+0

'n' erhöht sich bei jedem Aufruf von factory_girl wie" create ". –

+0

Also wird jede dieser Sequenzen die gleiche n .... das kann nicht richtig sein? – RenegadeAndy

Verwandte Themen