Mam zadanie rake, które wypełnia pewne początkowe dane w mojej aplikacji rails. Na przykład kraje, stany, operatorzy komórkowi itp.
Sposób, w jaki to teraz skonfigurowałem, jest taki, że mam kilka instrukcji create w plikach w / db / fixtures i zadanie rake, które je przetwarza. Na przykład jeden model, który mam, to motywy. Mam plik theme.rb w / db / fixtures, który wygląda następująco:
Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
:component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
:join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
:cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)
Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
:component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
:join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
:cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)
Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
:component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
:join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
:cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"
Chodzi o to, że chcę zainstalować kilka motywów stockowych dla użytkowników na początek. Mam problem z tą metodą.
Ustawienie ID nie działa. Oznacza to, że jeśli zdecyduję się dodać motyw, nazwijmy go „czerwonym”, chciałbym po prostu dodać instrukcję motywu do tego pliku ustawień i wywołać zadanie rake, aby ponownie umieścić bazę danych. Jeśli to zrobię, ponieważ motywy należą do innych obiektów i ich id zmienia się po ponownej inicjalizacji, wszystkie linki są zepsute.
Moje pytanie brzmi przede wszystkim: czy to dobry sposób na obsadzenie bazy danych? W poprzednim poście polecono mi to.
Jeśli tak, jak mogę na stałe zakodować identyfikatory i czy są jakieś wady?
Jeśli nie, jaki jest najlepszy sposób zapełnienia bazy danych?
Naprawdę docenię długie i przemyślane odpowiedzi, które zawierają najlepsze praktyki.
Wygląda na to, że factory_bot zrobi to, co chcesz osiągnąć. Można zdefiniować wszystkie wspólne atrybuty w domyślnej definicji, a następnie nadpisać je w czasie tworzenia. Możesz również przekazać identyfikator do fabryki:
Factory.define :theme do |t| t.background_color '0x000000' t.title_text_color '0x000000', t.component_theme_color '0x000000' t.carrier_select_color '0x000000' t.label_text_color '0x000000', t.join_upper_gradient '0x000000' t.join_lower_gradient '0x000000' t.join_text_color '0x000000', t.cancel_link_color '0x000000' t.border_color '0x000000' t.carrier_text_color '0x000000' t.public true end Factory(:theme, :id => 1, :name => "Lite", :background_color => '0xC7FFD5') Factory(:theme, :id => 2, :name => "Metallic", :background_color => '0xC7FFD5') Factory(:theme, :id => 3, :name => "Blues", :background_color => '0x0060EC')
Użyty z fakerem może bardzo szybko zapełnić bazę danych skojarzeniami bez konieczności majstrowania przy Fixtures (fuj).
Mam taki kod w zadaniu prowizji.
100.times do Factory(:company, :address => Factory(:address), :employees => [Factory(:employee)]) end
źródło
Używanie
seeds.rb
pliku lubFactoryBot
jest świetne, ale te są odpowiednio świetne do stałych struktur danych i testowania.seedbank
Klejnot może dać większą kontrolę i modułowość do swoich nasion. Wstawia zadania rake, a także możesz zdefiniować zależności między nasionami. Twoja lista zadań rake będzie zawierała następujące dodatki (np.):rake db:seed # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/ENVIRONMENT/*.seeds.rb. ENVIRONMENT is the current environment in Rails.env. rake db:seed:bar # Load the seed data from db/seeds/bar.seeds.rb rake db:seed:common # Load the seed data from db/seeds.rb and db/seeds/*.seeds.rb. rake db:seed:development # Load the seed data from db/seeds.rb, db/seeds/*.seeds.rb and db/seeds/development/*.seeds.rb. rake db:seed:development:users # Load the seed data from db/seeds/development/users.seeds.rb rake db:seed:foo # Load the seed data from db/seeds/foo.seeds.rb rake db:seed:original # Load the seed data from db/seeds.rb
źródło
Railsy mają wbudowany sposób wysyłania danych, jak wyjaśniono tutaj .
Innym sposobem byłoby użycie klejnotu do bardziej zaawansowanego lub łatwiejszego rozstawienia, takiego jak: bank nasion .
Główną zaletą tego klejnotu i powodem, dla którego go używam, jest to, że ma zaawansowane możliwości, takie jak zależności ładowania danych i dane początkowe dla poszczególnych środowisk.
Dodanie aktualnej odpowiedzi, ponieważ pojawiła się ona jako pierwsza w Google.
źródło
Najlepszym sposobem jest użycie urządzeń.
Uwaga: pamiętaj, że urządzenia wstawiają bezpośrednio i nie używają modelu, więc jeśli masz wywołania zwrotne, które wypełniają dane, musisz znaleźć obejście.
źródło
Dodaj go do migracji baz danych, dzięki czemu wszyscy otrzymają go podczas aktualizacji. Obsługuj całą swoją logikę w kodzie ruby / rails, więc nigdy nie musisz mieszać z jawnymi ustawieniami identyfikatora.
źródło