section id="rails.model" xreflabel="model"
Odkazy:
Implementuje datový model / obchodní objekty.
Rail používá pro reprezentaci datového modelu třídu ActiveRecord
.
V RoR je pro práci s datovám modelem použita třída ActiveRecord
.
Tato třída má určité požadavky na strukturu databáze a datové tabulky.
Objekt třídy ActiveRecord
vytváří jméno datové tabulky z vlastního jména třídy. Předpokládá že jméno třídy reprezentující datovou tabulku podstatné jmnéno v jednotném tvaru (singulár) v anglickém jazyce. U datové tabulky pak předpokládá odpovídající jméno v množném tvaru (plurál). Pokud tomu tak není, lze jméno datové tabulky předefinovat pomocí příkazu set_table_name
nebo nastavením proměnné table_name
.
class Call < ActiveRecord::Base set_table_name "rad_radios" ⋮ end
nebo
class Call < ActiveRecord::Base table_name = "rad_radios" ⋮ end
Obě varianty jsou v použití rovnocenné.
Dalším skrytým předpokladem třídy ActiveRecord
je název sloupce s jednoznačným identifikátorem (klíčem). ActiceRecord
předpokládá že tento sloupec se jmenuje id
. Jeho jméno můžeme opět předefinovat příkazem set_primary_key
nebo nastavením proměnné primary_key
.
class Call < ActiveRecord::Base set_table_name "rad_radios" set_primary_key "rad_id" ⋮ end
nebo
class Call < ActiveRecord::Base table_name = "rad_radios" primary_key = "rad_id" ⋮ end
Obě varianty jsou v použití rovnocenné.
FIXME:Některé databázové servery a nebo jejjich starší verze neznají automaticky generované sekvenční čísla, jednou z takových databází je Firebird.
class Call < ActiveRecord::Base set_sequence_name "rad_radios_generator" ⋮ end
nebo
class Call < ActiveRecord::Base sequence_name = "rad_radios_generator" ⋮ end
Pokud názvy našich tabulek v databázi nejsou v angličtině a nevyhovují nárokum ActiveRecord, je třeba provést před vytvořením modelu úpravy v inflectoru.
Zavedeme tedy do konfigurace config/environment.rb
tvar jednotného a množného čísla jména tabulky.
Například pro tabulku středisek jenž se jmenuje strediska
zavedeme jednotné a množné číslo tohoto jména.
Inflector.inflections do |inflect| inflect.irregular 'stredisko', 'strediska' end
Hned si ověříme, jestli vše funguje jak potřebujeme.
$
script/consoleLoading development environment
>>
Inflector.pluralize 'stredisko'=> "strediska"
>>
Inflector.singularize 'strediska'=> "stredisko"
Teď teprve můžeme přistoupit k vygenerování modelu. Model generujeme příkazem script/generate model.
script/generate model [volby] název_modelu
V našem případě, kd máme tabulku středisek pojmenovanou strediska
, vytvoříme model pojmenovaný jednotným číslem Stredisko
.
$
script/generate model --svn Strediskoexists app/models/ exists test/unit/ exists test/fixtures/ create app/models/stredisko.rb A app/models/stredisko.rb create test/unit/stredisko_test.rb A test/unit/stredisko_test.rb create test/fixtures/strediska.yml A test/fixtures/strediska.yml exists db/migrate create db/migrate/002_create_strediska.rb A db/migrate/002_create_strediska.rb
Například model pro datovou tabulku hosts
vytvoříme a přidáme do subversion příkazem
$
scrip/generate model --svn Hostexists app/models/ exists test/unit/ exists test/fixtures/ create app/models/host.rb A app/models/host.rb create test/unit/host_test.rb A test/unit/host_test.rb create test/fixtures/hosts.yml A test/fixtures/hosts.yml create db/migrate A db/migrate create db/migrate/001_create_hosts.rb A db/migrate/001_create_hosts.rb $