Czy ActiveRecord ma wbudowaną funkcję upsert? Wiem, że sam mogłem to napisać, ale oczywiście nie chcę, jeśli coś takiego już istnieje.Upsert in Rails ActiveRecord
Odpowiedz
Model.find_or_initialize
Prawdopodobnie robi to, co chcesz. Możesz połączyć go z save
lub update_attributes
, jeśli ma to sens.
Więcej informacji pod numerem Rails Guides.
Istnieje również Model.find_or_create
To nie robi upsert. Wykonuje selekcję, a następnie (opcjonalnie) wstawkę. Wpływasz na ten sam efekt w świecie z pojedynczym gwintem, w świecie wielowątkowym, ale potrzebujesz go, by uzyskać rzeczywisty efekt. – tybro0103
Właśnie natknąłem tej biblioteki: https://github.com/seamusabshere/upsert
nie testowałem go jeszcze, ale wygląda obiecująco
napisałem na blogu jak możemy to osiągnąć. Sprawdź to here.
Musisz napisać aktywne rozszerzenie rekordu. Będzie wyglądać mniej więcej tak.
module ActiveRecordExtension
extend ActiveSupport::Concern
def self.upsert(attributes)
begin
create(attributes)
rescue ActiveRecord::RecordNotUnique, PG::UniqueViolation => e
find_by_primary_key(attributes['primary_key']).
update(attributes)
end
end
end
ActiveRecord::Base.send(:include, ActiveRecordExtension)
Mechanizm Upgrade IMO wymaga niestandardowej konfiguracji dla każdego modelu.
Najlepszym rozwiązaniem byłoby zaimplementowanie niestandardowego zapytania SQL dla modelu, np.
insert into <table> (<field_1>, ..., <field_n>)
values (<field_1_value>, ..., <field_n_value>)
on duplicate key update
field_x = field_x_value,
...
field_z = field_z_value;
- 1. Upsert in Mongoid
- 2. model before_create in rails
- 3. Rails/ActiveRecord - AdapterNotSpecyfikowany, chociaż jest
- 4. cattr_accessor in Rails?
- 5. Używanie send_file in rails
- 6. Sprites in Rails 3.1
- 7. Używanie acts_as_list z has_many: through in rails
- 8. Monkey Patching in Rails 3
- 9. Mysterious EOFError in Rails 4
- 10. Rails 3 Zapytanie ActiveRecord przy użyciu zarówno SQL IN, jak i operatorów SQL OR
- 11. Scope vs Class Method in Rails 3
- 12. Rails ActiveRecord sprawdzanie poprawności dla zmiennych nieobowiązkowych
- 13. ratunkowy z ActiveRecord :: RecordNotFound w Rails
- 14. Rails 3 - ActiveRecord i Reverse Sort
- 15. Rails ActiveRecord: Wiele warunków w znalezieniu
- 16. Rails 4, surowe zapytanie za pomocą ActiveRecord
- 17. Rails 3 ActiveRecord zawiera funkcje warunkowe?
- 18. Ruby on Rails/ActiveRecord and Table Partition
- 19. Wyłączyć verbose sql/ActiveRecord dla Rails 3.1.1
- 20. Zrozumienie rails ActiveRecord "single model" self join
- 21. Wkładka atomowa lub inkrementacja w ActiveRecord/Rails
- 22. Rails 3 ActiveRecord API: .build method
- 23. Rails 3 ActiveRecord .skip_callback thread safety
- 24. Rails 3: Handle ActiveRecord :: RecordNotUnique Exception
- 25. MongoDB: upsert sub-dokumentów
- 26. Devise and Rails - ArgumentError in Devise :: RegistrationsController # create
- 27. Jak mogę przetestować ActiveRecord :: RecordNotFound w mojej aplikacji rails?
- 28. Porównaj Time.now in Rails, ale ignoruj rok?
- 29. map from_plugin routes in Rails 3
- 30. html.haml vs haml in Rails zobacz szablony
zobacz komentarz na temat odpowiedzi na makaron – tybro0103
Czy ktokolwiek to widział, generuje upsert? Przewodnik po szynach wskazuje, że nowy obiekt nie będzie jeszcze przechowywany w DB, więc nie widzę, jak to jest prawdziwy pakiet DB. Oznacza to, że nie będzie działać niezawodnie w środowisku wielowątkowym. – stuckj
To rozwiązanie ma problemy z współbieżnością. Nie powiedzie się, jeśli inny wątek aktualizuje tabelę między 'find_or_initialize' i' save'. –