edge
Daugiau informacijos rubyonrails.org: Daugiau apie Ruby on Rails

Aktyvusis įrašas: pagrindai

Šis vadovas yra įvadas į aktyvųjį įrašą.

Po šio vadovo perskaitymo jūs žinosite:

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 stulpelis Article klasėje, kuri turi daug Comment 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.