1 Kas yra aktyvusis įrašas?
Aktyvusis įrašas yra M „MVC“ - modelis - tai sistemos sluoksnis, atsakingas už verslo duomenis ir logiką. Aktyvusis įrašas palengvina verslo objektų kūrimą ir naudojimą, kurių duomenys reikalauja nuolatinio saugojimo duomenų bazėje. Tai yra aktyvaus įrašo modelio įgyvendinimas, kuris pats yra objektų-relacinių atvaizdavimo sistemos aprašymas.
1.1 Aktyvaus įrašo modelis
Aktyvus įrašas buvo aprašytas Martinu Fowleriu jo knygoje „Enterprise Application Architecture Patterns“. Aktyvusis įrašas, objektai neša tiek nuolatinius duomenis, tiek elgesį, kuris veikia su šiais duomenimis. Aktyvusis įrašas mano, kad užtikrinant duomenų prieigos logiką kaip dalį objekto, tai išmokys šio objekto naudotojus, kaip rašyti ir skaityti iš duomenų bazės.
1.2 Objektų-relacinių atvaizdavimas
Objektų-relacinių atvaizdavimas, dažnai vadinamas jo santrumpa ORM, yra technika, kuri jungia aplikacijos turtingus objektus su lentelėmis reliacinėje duomenų bazės valdymo sistemoje. Naudojant ORM, aplikacijos objektų savybės ir ryšiai gali būti lengvai saugomi ir išgauti iš duomenų bazės, nerašant SQL užklausų tiesiogiai ir mažiau bendrojo duomenų bazės prieigos kodo.
Pastaba: Pagrindinė žinių apie reliacines duomenų bazes (RDBMS) ir struktūrizuotą užklausų kalbą (SQL) yra naudinga, norint visiškai suprasti aktyvųjį įrašą. Norėdami sužinoti daugiau, kreipkitės į šį vadovą (arba šį) arba studijuokite juos kitaip.
1.3 Aktyvusis įrašas kaip ORM pagrindas
Aktyvusis įrašas suteikia mums keletą mechanizmų, svarbiausias iš jų yra galimybė:
- Repristatyti modelius ir jų duomenis.
- Repristatyti ryšius tarp šių modelių.
- Repristatyti paveldėjimo hierarchijas per susijusius modelius.
- Patikrinti modelius prieš juos išsaugant duomenų bazėje.
- Atlikti duomenų bazės operacijas objektiškai.
2 Konvencija prieš konfigūraciją aktyviame įraše
Rašant programas naudojant kitas programavimo kalbas ar karkasus, gali būti būtina parašyti daug konfigūracijos kodo. Tai ypač pasakytina apie ORM karkasus apskritai. Tačiau, jei laikotės „Rails“ priimtų konvencijų, kuriant aktyvaus įrašo modelius, jums reikės parašyti labai mažai konfigūracijos (kai kuriuose atveju visai nereikia konfigūracijos). Idėja yra ta, kad jei dažniausiai konfigūruojate savo programas ta pačiai būdu, tai turėtų būti numatytasis būdas. Taigi, aiški konfigūracija būtų reikalinga tik tuomet, kai negalite laikytis standartinės konvencijos.
2.1 Pavadinimo konvencijos
Pagal numatytuosius nustatymus aktyvusis įrašas naudoja kai kurias pavadinimo konvencijas, kad sužinotų, kaip sukurti atitinkamą modelio ir duomenų bazės lentelės atvaizdavimą. „Rails“ daugins jūsų klasės pavadinimus, kad rastų atitinkamą duomenų bazės lentelę. Taigi, klasės „Book“ atveju turėtumėte turėti duomenų bazės lentelę, vadinamą books. „Rails“ dauginimo mechanizmai yra labai galingi, galintys dauginti (ir vienaskaitinti) tiek reguliarius, tiek nereguliarius žodžius. Naudojant iš dviejų ar daugiau žodžių sudarytus klasės pavadinimus, modelio klasės pavadinimas turėtų sekti „Ruby“ konvencijas, naudojant „CamelCase“ formą, o lentelės pavadinimas turi naudoti „snake_case“ formą. Pavyzdžiai:
- Modelio klasė - Vienaskaita su kiekvieno žodžio pirmąja raide didžiąja (pvz.,
BookClub
). - Duomenų bazės lentelė - Daugiskaita su pabraukimais tarp žodžių (pvz.,
book_clubs
).
Modelio / Klasės pavadinimas | Lentelės / Schemos pavadinimas |
---|---|
Article |
articles |
LineItem |
line_items |
Deer |
deers |
Mouse |
mice |
Person |
people |
2.2 Schemos konvencijos
Aktyvusis įrašas naudoja pavadinimo konvencijas duomenų bazės lentelėse esančioms stulpelių, priklausomai nuo šių stulpelių paskirties.
- Užsienio raktai - Šie laukai turėtų būti pavadinti pagal šabloną
singularized_table_name_id
(pvz.,item_id
,order_id
). Tai yra laukai, kuriuos aktyvusis įrašas ieškos, kai kuriate asociacijas tarp savo modelių. Pagrindiniai raktai - Pagal numatytuosius nustatymus aktyvusis įrašas naudos sveikųjų skaičių stulpelį, pavadintą
id
, kaip lentelės pagrindinį raktą (bigint
„PostgreSQL“ ir „MySQL“ atveju,integer
„SQLite“ atveju). Naudojant aktyvaus įrašo migracijas savo lentelėms kurti, šis stulpelis bus automatiškai sukurtas. Taip pat yra keletas pasirinktinų stulpelių pavadinimų, kurie prideda papildomas funkcijas Active Record objektams:created_at
- Automatiškai nustatomas į dabartinę datą ir laiką, kai įrašas pirmą kartą sukurtas.updated_at
- Automatiškai nustatomas į dabartinę datą ir laiką, kai įrašas yra sukurtas arba atnaujinamas.lock_version
- Prideda optimistinį užrakinimą modeliui.type
- Nurodo, kad modelis naudoja vieno lentelės paveldėjimą.(sąjungos_pavadinimas)_type
- Saugo tipą polimorfinėms sąsajoms.(lentelės_pavadinimas)_count
- Naudojamas kaupiant priklausančių objektų skaičių sąsajose. Pavyzdžiui,comments_count
stulpelisArticle
klasėje, kuri turi daugComment
objektų, kaupia esamų komentarų skaičių kiekvienam straipsniui.
PASTABA: Nors šie stulpelių pavadinimai yra pasirinktiniai, jie iš tikrųjų yra rezervuoti Active Record. Venkite rezervuotų žodžių, nebent norite papildomos funkcionalumo. Pavyzdžiui, type
yra rezervuotas žodis, naudojamas nurodyti lentelę, naudojant vieno lentelės paveldėjimą (STI). Jei nenaudojate STI, pabandykite panašų žodį, pvz., "context", kuris vis tiek gali tiksliai apibūdinti modeliuojamus duomenis.
3 Kuriant Active Record modelius
Generuojant aplikaciją, app/models/application_record.rb
bus sukurtas abstraktus ApplicationRecord
klasės failas. Tai yra pagrindinė klasė visiems aplikacijos modeliams ir tai, kas paverčia įprastą Ruby klasę į Active Record modelį.
Norėdami sukurti Active Record modelius, paveldėkite ApplicationRecord
klasę ir jūs galite pradėti:
class Product < ApplicationRecord
end
Tai sukurs Product
modelį, susiejantį su products
lentele duomenų bazėje. Taip padarydami, turėsite galimybę susieti kiekvieno įrašo stulpelius šios lentelės su jūsų modelio objektų atributais. Pavyzdžiui, jei products
lentele buvo sukurta naudojant SQL (arba vieną iš jo plėtinių) užklausą, panašią į šią:
CREATE TABLE products (
id int(11) NOT NULL auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
Pateikta schemoje deklaruojama lentele su dviem stulpeliais: id
ir name
. Kiekvienas šios lentelės įrašas atitinka tam tikrą produktą su šiais du parametrais. Taigi, galėtumėte rašyti kodą, panašų į šį:
p = Product.new
p.name = "Some Book"
puts p.name # "Some Book"
4 Perrašant pavadinimo konvencijas
Ką daryti, jei norite naudoti kitą pavadinimo konvenciją arba norite naudoti savo Rails aplikaciją su sena duomenų baze? Nėra problema, galite lengvai perrašyti numatytąsias konvencijas.
Kadangi ApplicationRecord
paveldi iš ActiveRecord::Base
, jūsų aplikacijos modeliams bus prieinama daug naudingų metodų. Pavyzdžiui, galite naudoti ActiveRecord::Base.table_name=
metodą, kad priderintumėte naudojamą lentelės pavadinimą:
class Product < ApplicationRecord
self.table_name = "my_products"
end
Tai padarius, turėsite rankiniu būdu apibrėžti klasės pavadinimą, kuri talpina fiktyvius duomenis (my_products.yml
), naudodami set_fixture_class
metodą savo testų aprašyme:
# test/models/product_test.rb
class ProductTest < ActiveSupport::TestCase
set_fixture_class my_products: Product
fixtures :my_products
# ...
end
Taip pat galima perrašyti stulpelį, kuris turėtų būti naudojamas kaip lentelės pirminis raktas, naudojant ActiveRecord::Base.primary_key=
metodą:
class Product < ApplicationRecord
self.primary_key = "product_id"
end
PASTABA: Active Record nepalaiko naudoti ne pirminio rakto stulpelius, kurie vadinasi id
.
PASTABA: Jei bandysite sukurti stulpelį, kuris vadinasi id
ir nėra pirminis raktas, Rails metuose, pvz., migracijose, bus išmetama klaida, tokia kaip:
you can't redefine the primary key column 'id' on 'my_products'.
To define a custom primary key, pass { id: false } to create_table.
5 CRUD: Duomenų skaitymas ir rašymas
CRUD yra akronimas, kuris apibūdina keturis veiksmus, kuriuos naudojame dirbdami su duomenimis: Create (kurti), Read (skaityti), Update (atnaujinti) ir Delete (trinti). Active Record automatiškai sukuria metodus, leidžiančius aplikacijai skaityti ir manipuliuoti duomenimis, saugomais lentelėse.
5.1 Kurti
Active Record objektai gali būti sukurti iš hash'o, bloko arba jų atributai gali būti nustatomi rankiniu būdu po sukūrimo. new
metodas grąžins naują objektą, o create
grąžins objektą ir jį išsaugos duomenų bazėje.
Pavyzdžiui, turint modelį User
su atributais name
ir occupation
, create
metodo iškvietimas sukurs ir išsaugos naują įrašą duomenų bazėje:
user = User.create(name: "David", occupation: "Code Artist")
Naudodami new
metodą, galite sukurti objektą, nesaugodami jo:
user = User.new
user.name = "David"
user.occupation = "Code Artist"
Iškvietus user.save
, įrašas bus įrašytas į duomenų bazę.
Galiausiai, jei pateikiamas blokas, tiek create
, tiek new
perduos naują
objektą tam blokui inicializuoti, tačiau tik create
išsaugos
gaunamą objektą į duomenų bazę:
user = User.new do |u|
u.name = "David"
u.occupation = "Code Artist"
end
5.2 Skaityti
Active Record teikia gausią API, skirtą duomenų prieigai prie duomenų bazės. Žemiau pateikiami keli pavyzdžiai, kaip naudoti skirtingus duomenų prieigos metodus, kuriuos teikia Active Record.
# grąžinti kolekciją su visais vartotojais
users = User.all
# grąžinti pirmą vartotoją
user = User.first
# grąžinti pirmą vartotoją, vardu David
david = User.find_by(name: 'David')
# rasti visus vartotojus, kurių vardas David ir profesija Code Artist, ir surūšiuoti pagal sukūrimo datą atvirkštine tvarka
users = User.where(name: 'David', occupation: 'Code Artist').order(created_at: :desc)
Daugiau informacijos apie užklausas į Active Record modelį galite rasti Active Record Query Interface vadove.
5.3 Atnaujinti
Gavus Active Record objektą, galima modifikuoti jo atributus ir jį išsaugoti į duomenų bazę.
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save
Trumpinys šiam veiksmui yra naudoti hash'ą, kuriame atributai yra susieti su norimu reikšme, pavyzdžiui:
user = User.find_by(name: 'David')
user.update(name: 'Dave')
Tai yra naudinga, kai reikia atnaujinti kelis atributus vienu metu.
Jei norite atnaujinti kelis įrašus masiškai be iškvietimo atgalinio kvietimo ar
tikrinimo, galite tiesiogiai atnaujinti duomenų bazę naudodami update_all
:
User.update_all max_login_attempts: 3, must_change_password: true
5.4 Ištrinti
Taip pat, gavus Active Record objektą, jį galima sunaikinti, tai pašalins jį iš duomenų bazės.
user = User.find_by(name: 'David')
user.destroy
Jei norite ištrinti kelis įrašus masiškai, galite naudoti destroy_by
arba destroy_all
metodą:
# rasti ir ištrinti visus vartotojus, kurių vardas David
User.destroy_by(name: 'David')
# ištrinti visus vartotojus
User.destroy_all
6 Validacijos
Active Record leidžia jums patikrinti modelio būseną prieš jį įrašant į duomenų bazę. Yra keletas metodų, kuriuos galite naudoti, kad patikrintumėte savo modelius ir patikrintumėte, ar atributo reikšmė nėra tuščia, yra unikali ir dar nėra duomenų bazėje, atitinka tam tikrą formatą ir daugiau.
Metodai, tokie kaip save
, create
ir update
, patikrina modelį prieš jį išsaugant
į duomenų bazę. Kai modelis yra neteisingas, šie metodai grąžina false
ir jokie
duomenų bazės veiksmai nevykdomi. Visi šie metodai turi bang priešininkus
(tai yra, save!
, create!
ir update!
), kurie yra griežtesni, nes jie
kelia ActiveRecord::RecordInvalid
išimtį, kai validacija nesėkminga.
Greitas pavyzdys:
class User < ApplicationRecord
validates :name, presence: true
end
irb> user = User.new
irb> user.save
=> false
irb> user.save!
ActiveRecord::RecordInvalid: Validation failed: Name can’t be blank
Daugiau apie validacijas galite sužinoti Active Record Validations guide.
7 Atgaliniai kvietimai
Active Record atgaliniai kvietimai leidžia pridėti kodą prie tam tikrų modelio gyvavimo ciklo įvykių. Tai leidžia pridėti elgseną prie modelių, kai šie įvykiai įvyksta, pvz., kai sukuriamas naujas įrašas, jis atnaujinamas, sunaikinamas ir t.t.
class User < ApplicationRecord
after_create :log_new_user
private
def log_new_user
puts "A new user was registered"
end
end
irb> @user = User.create
A new user was registered
Daugiau apie atgalinius kvietimus galite sužinoti Active Record Callbacks guide.
8 Migracijos
Rails suteikia patogų būdą valdyti duomenų bazės schemos pakeitimus naudojant migracijas. Migracijos yra rašomos domeno specifiniu kalbos ir saugomos failuose, kurie vykdomi prieš bet kurią duomenų bazę, kurią palaiko Active Record.
Čia yra migracija, kuri sukuria naują lentelę, vadinamą publications
:
class CreatePublications < ActiveRecord::Migration[7.1]
def change
create_table :publications do |t|
t.string :title
t.text :description
t.references :publication_type
t.references :publisher, polymorphic: true
t.boolean :single_issue
t.timestamps
end
end
end
Reikia pažymėti, kad aukščiau pateiktas kodas yra nepriklausomas nuo duomenų bazės: jis veiks MySQL, PostgreSQL, SQLite ir kitose duomenų bazėse.
Rails seka, kurios migracijos buvo įrašytos į duomenų bazę ir jas saugo
šalia esančioje lentelėje toje pačioje duomenų bazėje, vadinamoje schema_migrations
.
Norint paleisti migraciją ir sukurti lentelę, reikia paleisti bin/rails db:migrate
, o norint atšaukti migraciją ir ištrinti lentelę, bin/rails db:rollback
.
Daugiau informacijos apie migracijas galite rasti Active Record Migrations gide.
9 Asociacijos
Active Record asociacijos leidžia apibrėžti ryšius tarp modelių. Asociacijos gali būti naudojamos aprašyti vienas-prie-vieno, vienas-prie-daug ir daug-prie-daug ryšius. Pavyzdžiui, ryšį "Autorius turi daug Knygų" galima apibrėžti taip:
class Author < ApplicationRecord
has_many :books
end
Autoriaus klasėje dabar yra metodai, skirti pridėti ir pašalinti knygas iš autoriaus ir daugiau.
Daugiau informacijos apie asociacijas galite rasti Active Record Associations gide.
Atsiliepimai
Jūs esate skatinami padėti pagerinti šio vadovo kokybę.
Prašome prisidėti, jei pastebite rašybos klaidų ar faktinių klaidų. Norėdami pradėti, galite perskaityti mūsų dokumentacijos prisidėjimo skyrių.
Taip pat gali būti nepilnos informacijos arba informacijos, kuri nėra atnaujinta. Prašome pridėti bet kokią trūkstamą dokumentaciją pagrindiniam. Patikrinkite Edge vadovus pirmiausia, ar problemas jau išspręsta arba ne pagrindinėje šakoje. Patikrinkite Ruby on Rails vadovų gaires dėl stiliaus ir konvencijų.
Jei dėl kokios nors priežasties pastebite kažką, ką reikia ištaisyti, bet negalite patys tai pataisyti, prašome pranešti apie problemą.
Ir galiausiai, bet ne mažiau svarbu, bet koks diskusijos dėl Ruby on Rails dokumentacijos yra labai laukiamos oficialiame Ruby on Rails forume.