Może niektórzy eksperci od rubinów rzucają nieco światła na to, w jaki sposób activerecord wie, jak wstawić lub zaktualizować wywołanie save(). jaka jest logika stojąca za tym? czy sprawdza, czy klucz podstawowy jest pusty czy coś takiego, a jeśli tak, to wstawi, jeśli nie aktualizację?w jaki sposób activerecord wie, jak wykonać wstawianie lub aktualizację?
Odpowiedz
Chociaż to dobrze dla niektórych ludzi, aby powiedzieć "RTFM" I raczej więcej walk-through-ale-jeszcze-entirely- bezużyteczne, kiedy, Szyny 3-przychodzi-out-i-zmiany-wszystko odpowiedź:
Jak to działa w Rails 2.3 (aka "dzisiaj")
save
wzywa create_or_update
który wygląda następująco:
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : update
result != false
end
Można zignorować pierwszą linię tej metody, jak to tylko podnosi błąd, jeśli płyta jest tylko do odczytu (zwykle nie jest, ale w przypadku złączeń może być) . Tutaj interesuje nas druga i trzecia linia metody.
Druga linia nazywa new_record?
który jest zdefiniowany jako to:
# Returns true if this object hasn't been saved yet -- that is, a record for the object doesn't exist yet; otherwise, returns false.
def new_record?
@new_record || false
end
I zmienna @new_record
jest ustawiony gdy initialize
(new
rozmowy initialize
i daje nam nowy obiekt, niektóre tło Ruby-fu tutaj) metoda jest wywoływana.
Więc jeśli ten @new_record
jest true
będzie to nazwać create
a jeśli jest to fałszywy będzie to nazwać update
który prowadzi nas do tego, co jesteś po, myślę.
Ponadto, po znalezieniu rekordu nie jest wywoływany initialize
i dlatego nie ustawia @new_record
. Jeśli zauważyłeś, kod pod numerem new_record?
był @new_record || false
, co oznacza, że zwróci wartość false, jeśli nie ustawiono @new_record
.
Załóżmy na przykład, że chcesz znaleźć ostatni rekord Forum
, aby wykonać Forum.last
.
- To wywołuje metodę
last
na klasieForum
, która dziedziczy z ActiveRecord :: Base last
calls metoda klasyfind
.find
callsfind_last
find_last
callsfind_initial
find_initial
callsfind_every
find_every
callsfind_by_sql
- i
find_by_sql
rozmowyinstantiate
Zobaczysz tutaj, że nigdzie po tej zmianie nie jest ustawiony nowy rekord @new_record
, a zatem każdy rekord uzyskany przez find
nie będzie nowym rekordem.
Mam nadzieję, że to pomaga zrozumieć.
bardzo ładna odpowiedź i myślę, że na czas, aby ją napisać. Interesuje mnie również wiedzieć, co ustawiłoby @nw_record na false? czy wykonałby to, gdyby wyciągnął rekord z bazy danych? – rip747
Zaktualizowałem wpis, używając łańcucha metod wyszukiwania. –
Czy mimo to należy zmodyfikować atrybut "new_record" samodzielnie –
To principaly polega na metodzie new_record?.
Ta metoda zwraca wartość true, jeśli jest to nowy rekord, a false, jeśli nie jest.
W rzeczywistości nie jest to trudne.
- Po otrzymaniu istniejącego rekordu nie jest nowy. Tak więc
new_record?
może bezpośrednio zwracać fałsz. - Po utworzeniu nowego rekordu (
Model.new
),new_record?
zwróci wartość true. To nowy rekord. - Po zapisaniu nowego rekordu nie jest on już nowy. Zmieniono wewnętrzną zmienną
@new_record
.new_record?
nie będzie już zwracany true.
Aby sprawdzić, kiedy zdarza się, przejdź do ActiveRecord::Base, linia 2911
self.id ||= new_id
@new_record = false
id
end
Podłączasz się do mistrza, kiedy prawdopodobnie używa 2.3. –
To nie zmienia mojej argumentacji. Ale i tak zaktualizowałem link. –
- 1. Użyj spustu, aby zatrzymać wstawianie lub aktualizację
- 2. W jaki sposób kompilator wie, który blok catch ma wykonać?
- 3. W jaki sposób bios wie, jaki rodzaj BPB jest obecny?
- 4. Rails Override Zapisz, aby wykonać aktualizację selektywną
- 5. W jaki sposób Apache Spark wie o węzłach danych HDFS?
- 6. W jaki sposób C# wie, jaki jest typ literału?
- 7. W jaki sposób Java wie jak modyfikować tablicę?
- 8. W jaki sposób Bundler wie, z jakiego środowiska korzystać?
- 9. W jaki sposób malloc() wie, gdzie zaczyna się hałda?
- 10. W jaki sposób wykonać autouzupełnianie kodu?
- 11. W jaki sposób można warunkowo zbudować kwerendę ActiveRecord w Railsach?
- 12. W jaki sposób czytnik RSS wie, że kanał jest aktualizowany?
- 13. Xamarin.iOS UITableView, w jaki sposób wymuszasz aktualizację komórki?
- 14. Mongoose.js: jak zaimplementować tworzenie lub aktualizację?
- 15. Jak wykonać Wstawianie zbiorcze - Linq do encji
- 16. W jaki sposób proces node.js wie, kiedy należy zatrzymać?
- 17. W jaki sposób Chocolatey wie, które pakiety są zainstalowane lokalnie?
- 18. W jaki sposób Perl wie, że plik jest binarny?
- 19. Jaki jest najprostszy sposób na aktualizację schematu mnesii?
- 20. Reakcja: Najlepszy sposób na aktualizację siebie, ale uniemożliwić dzieciom aktualizację?
- 21. W jaki sposób mogę wykonać warunkową metodę collectEntries w groovy
- 22. Jaki jest najlepszy sposób na aktualizację (lub zamianę) całej tabeli bazy danych na uruchomionym komputerze?
- 23. Jak wykonać aktualizację zbiorczą na wiosnę z listą map?
- 24. Wkładka atomowa lub inkrementacja w ActiveRecord/Rails
- 25. W jaki sposób uruchamiasz aktualizację poprawki/częściowej bazy danych w Scala Slick?
- 26. W python, w jaki sposób mogę wykonać nieblokujące wywołanie systemowe?
- 27. Jak cofnąć aktualizację RequestFactory
- 28. Szyny 3 + activerecord, najlepszy sposób na "aktualizację zbiorczą" pojedynczego pola dla wszystkich rekordów spełniających warunek
- 29. wstawianie lub ignorowanie wielu dokumentów w mongoDB
- 30. W jaki sposób Grails wie, jak zastosować "układ" do stron, które renderuje?
Doskonałe pytanie. –