Папярэдні занятак

Ruby і Sqlite

Зараз калі Вы ўжо ведаеце як працаваць з базамі дадзеных нам трэба навучыць Ruby рабіць тое ж самае.

Спачатку нам трэба пазнаёміцца з яшчэ адной выдатнай рэччу якая ёсьць у Рубі – гэта Гемы. Гем – гэта маленькая праграма (бібліятэка) якая ўсталёўваецца ў Ваша прыкладаньне й дадае яму якія-небудзь функцыі. Гэтак жа як на айфоне або на андроідзе Вы маеце маркет, з якога можна ўсталяваць розныя прыкладаньні, так і тут ёсьць нешта накшталт маркета, зь якога можна ўсталяваць патрэбныя гемы.

Гем для працы з sqlite3 завецца sqlite3 :) Каб яго ўсталяваць у кансолі нам трэба выканаць:

  • gem install sqlite3

Мы ўжо можам карыстацца гема, але спачатку нам трэба стварыць новую базу дадзеных. Адчыніце кансоль і стварыце новую базу дадзеных address_book з табліцай contacts якая маё калёнку для id primary key і калёнку name.

Зараз стварыце новы файл у праекце й напішыце ў ім:

  • require 'sqlite3'
  • address_book_db = SQLite3::Database.open( "address_book" )
  • address_book_db.execute("INSERT INTO contacts (name) VALUES ('Ales');")

Даволі проста – аргумэнт у мэтада execute – гэта проста радок які інтэрпрэтуецца як SQL.

Дадайце яшчэ некалькі кантактаў.

Зараз давайце паглядзім што будзе калі выканаць сэлект:

  • contacts = address_book_db.execute("SELECT * FROM contacts;")
=> [["id", "name"], [1, "Kolia"]]

Зразумела. Вяртаецца масіў. А ці не было б лепей калі запісы вярталіся ў выглядзе хашэў? Напэўна было. Зробім!

  • address_book_db.results_as_hash = true

Зараз усе будзе выглядаць лепей. Як жа нам прабегчыся па сьпісу запісаў? Вядома – цыкл!

  • contacts.each {|contact| p contact}

Ключ – гэта назва калёнкі а значэньне – гэта значэньне запіса.

Так як мэтад execute проста выконвае каманду SQL мы таксама маглі стварыць табліцу з дапамогай яго. Але стварэньне й зьмяньне табліцаў – заданьне якое выконваецца аднойчы: спачатку Вы ствараеце схему базы дадзеных а потым прыкладаньне проста ведае (выкарыстоўвае) гэтую схему. Таму нашмат лепей і прасьцей рабіць зьмены са структурай базы дадзеных праз кансоль а не праз праграму.

Сьпіс to-do

Давайце пабудуем прыкладаньне якое будзе захоўваць сьпіс спраў якія трэба выканаць. Спачатку як заўсёды ствараем тэчку новага праекту to_do, і тэчцы spec і lib унутры.

Пачынаем з інтэрфэйса карыстальніка:

def welcome
  puts "No so many things left to be done! Welcome!"
  menu
end

def menu
  choice = nil
  until choice == 'e'
    puts "Press 'l' to list your tasks, 'a' to add a task, or 'd' to mark a task as done."
    puts "Press 'e' to exit."
    choice = gets.chomp
    case choice
    when 'l'
      list
    when 'a'
      add
    when 'd'
      mark_done
    when 'e'
      exit
    else
      invalid
    end
  end
end

def list
  puts "Here is everything you need to do:"
  tasks = Task.all
  tasks.each {|task| puts task.name}
end

welcome

Перад тым як мы пачнем упэўніцеся што дадалі require sqlite і task у свой файл. Потым адчыніце кансоль і стварыце базу дадзеных to_do. У ёй павінна быць табліца tasks з primary key і калёнка name.

Пачнем з таго што створым “заглушку” для мэтада Task.all:

class Task
  def self.all
    []
  end
end

Зараз наш код і тэсты можна выканаць!

Дапішыце мэтад Task#name каб тады калі мы будзем мець гатовы сьпіс заданьняў ён працаваў.

Даданьне й выманьне дадзеных

Наступная частка інтэрфэйса:

def add
  puts "What do you need to do?"
  item_name = gets.chomp
  task = Task.new(item_name)
  task.save
  "'#{item_name}' has been added to your To Do list."
end

Зараз нам трэба стварыць мэтад Task#save:

class Task
  def save
    DB.execute("INSERT INTO tasks (name) VALUES ('#{@name}');")
  end

  def self.all
    DB.execute("SELECT * FROM tasks;").inject([]) {|tasks, task_hash| tasks << Task.new(task_hash['name'])}
  end

DB як Вы здагадаліся – аб’екты базы дадзеных. Але якім чынам ён будзе даступны нам? Усё даволі проста. Каб зрабіць зьменную даступнай паўсюль нам трэба абвясьціць яе як канстанту. Канстанта – гэта зьменная якая не зьмяняецца на працягу выкананьня прыкладаньня й даступная паўсюль.

Проста абвясьціце Вашую зьменную з базай дадзеных вялікімі літарамі.

  • DB = SQLite3::Database.open( "address_book" )

Простая адрасная кніга

Гэта праграма будзе адраснай кніжкай для карыстальнікаў каб яны мелі магчымасьць захоўваць дадзеныя сваіх кантактаў. Вы пачнеце з вельмі простай функцыянальнасьці й паступова будзеце дадаваць слаі ў яе.

Вось тое што кажа нам наш карыстальнік, які хоча выкарыстоўваць нашу праграму:

  • Як карыстальнік, я хачу дадаваць кантакты ў сваю адрасную кнігу, каб захоўваць у адным месцы.
  • Як карыстальнік, я хачу захоўваць імя, імэіл, тэлефон і паштовы адрас для кожнага з маіх кантактаў.
  • Як карыстальнік, я хачу мець магчымасьць праглядзець сьпіс імэйлаў якія я маю.
  • Як карыстальнік, я хачу мець магчымасьць выбраць кантакт і праглядзець усю інфармацыю пра яго.
  • Як карыстальнік, я хачу рэдагаваць кантакт калі дадзеныя чалавека зьмяняюцца.
  • Як карыстальнік, я хачу мець магчымасьць выдаляць тыя кантакты, якія мне больш не патрэбны.

Дамашні, рабочы, мабільны

Ня часта зараз сустрэнеш чалавека, які мае толькі адзін тэлефон. Дадавайце дададзім гэта да адраснай кнігі.

  • Як карыстальнік, я хачу захоўваць дамашні, рабочы й мабільны нумары для маіх кантактаў.
  • Як карыстальнік, я хачу захоўваць рабочы й асабісты імэіл чалавека.

Валідацыя дадзеных

Часам адбываецца так, што Вы друкуючы імэіл робіце памылку, й, напраклад, забывайцеся дадаць знак @. Вядома гэта ня правільны імэіл. Таму наша праграма павінна такія данныя не прымыць.

  • Як карыстальнік, я хачу атрымлівацць паведмаленьне аб памылцы тады калі нумар тэлефона менш або больш за 12 лікаў (+375 12 3456789).
  • Як карыстальнік, я хачу атрымліваць паведамленьне аб памылцы тады калі ўведзены ня правільны імэіл.
  • Як карыстальнік, я хачу каб праграма адлюстроўвала тэлефоны ў фармаце (+375 29 123-45-67).

Некалькі падказак.

Каб праверыць імэіл вам трэба пазнаёміцца з тым што такое рэгулярны выраз, або regex. Знайдзіце дакумэнтацыю Рубі пра гэта ў сеціве.

Стварыце мэтад valid? які кажа ці прайшоў аб’ект валідацыю.

Калі аб’ект не прайшоў валідацыю, вяртайце false з мэтада save і не захоўвайце яго ў базу дадзеных. Калі ён прайшоў валідацыю вяртайце true.

Сістэма кіраваньня чыгункай

Стварыце праграму якая дазволіць кіраваць чыгуначнай сістэмай. Яна павінна дазваляць апэратарам чыгункі дадаваць станцыі а карыстальнікам чыгункі праглядаць яе.

  • Як апэратар чыгункі я хачу мець магчымасьць дадаваць новыя станцыі.
  • Як апэратар чыгункі я хачу мець магчымасьць дадаваць новыя лініі паміж станцыямі.
  • Як карыстальнік чыгункі, я хачу мець магчымасьць праглядзець усе станцыі на адной лініі.
  • Як карыстальнік чыгункі, я хачу мець магчымасьць праглядзець усе накірункі ў якіх ідуць цягнікі з гэтай станцыі.

Чыстка Вашага коду

Ці не заўважылі Вы што шмат якога коду ў Вашых класах аднолькавага? Напрыклад мэтад save дакладна існуе ва ўсіх класах; а мэтад all? Таксама. Тое ж і з мэтадам valid?. Вынясьце гэтыя мэтады ў асобны супер-клас для ўсіх Вашых класаў базы дадзеных.

Час падумаць над Вашым праектам

Падумайце якія “Як карыстальнік…” Вы маеце для Вашага праекта. Якім Вы яго бачыце. Стварыце сьпіс такіх патрабаваньняў. Потым схему ўзаемаадносін паміж мадэлямі ў WWW SQL Designer.

Наступны занятак