1
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ - ĐHQGHN
CÁC VẤN ĐỀ HIỆN ĐẠI CỦA
CÔNG NGHỆ PHẦN MỀM
RUBY ON RAILS
NGUYỄN NHẬT TÂN, NGUYỄN VĂN CƯỜNG, TRẦN MINH THẮNG
26/11/2013
Mục lục
1 Giới thiệu Ruby on Rails 4
1.1 Tại sao gọi là Ruby on Rails? 4
1.2 Một số Website dùng Ruby on Rails 4
1.3 Cài đặt Ruby on Rails 5
1.4 Công cụ phát triển 6
2 Đặc trưng của Ruby on Rails 6
2.1 Các đặc trưng cơ bản 6
2.2 Cấu trúc thư mục ứng dụng 7
2.3 Model – View – Controller 8
2.4 Model 8
2.5 View 8
2.6 Controller 9
3 Định tuyến trong Ruby on Rails 9
3.1 Giới thiệu 9
3.2 Path và URL Helper 10
3.3 Các tài nguyên lồng nhau 10
3.4 Tạo Path và URL từ Object 11
4 Active Record là gì? 12
5 Object Relational Mapping (ORM) 13
6 Active Record như là một ORM Framework 14
7 Quy ước về cấu hình trong Active Record 14
7.1 Quy ước đặt tên 14
7.2 Quy ước về lược đồ (schema) 15
2
8 Thao tác với Model 15
9 Console Rails 16
10 Cơ sở dữ liệu trong Rails 17
11 Quản lý Relation với Active Record 19
12 CRUD – đọc và ghi dữ liệu 21
12.1 Create 21
12.2 Read 21
12.3 Update 22
12.4 Delete 22
13 Active Record Migrations 22
14 Giới thiệu về Scaffolding 24
15 Đánh giá 24
16 Demo ứng dụng 26
16.1 Blog 26
16.2 Cửa hàng sách trực tuyến 26
3
1 Giới thiệu Ruby on Rails
1.1 Tại sao gọi là Ruby on Rails?
Ruby on Rails (RoR) là một web framework được viết bằng ngôn ngữ Ruby và tất
cả các ứng dụng trong Rails sẽ được viết bằng Ruby. Ruby on Rails được tạo ra để
hỗ trợ các lập trình viên việc phát triển các phần mềm nền web một cách nhanh
nhất có thể.
Rails framework tận dụng các đặc điểm của ngôn ngữ Ruby. Yukishiro Matzumoto
viết ra ngôn ngữ này vào năm 1995, nó khá giống với các ngôn ngữ thông dịch
khác như Perl, Eiffel, Python…. Ruby là ngôn ngữ script, định nghĩa kiểu động và
là một ngôn ngữ hướng đối tượng, nó được thiết kế với một cú pháp trong sáng, tạo
cảm giác dễ đọc, và viết code ngắn gọn nhất có thể đối người dùng, ví dụ như nó
không cần dấu chấm phẩy khi kết thúc câu lệnh, không cần các dấu ngoặc đơn khi
khai báo các phương thức, có những đoạn code thậm chí được viết giống như việc
chúng ta viết tiếng anh vậy.
Nó được thiết kế để lập trình ứng dụng web dễ dàng hơn bằng cách tạo ra các giả
định về những thứ mà nhà phát triển muốn bắt đầu. Rails là một phần mềm kiểu
độc đoán, tức là nó giả định rằng đây là cách tốt nhất để làm việc, và nó được thiết
kế để khuyến khích cách làm đó – và trong một số trường hợp nó ngăn cản những
lựa chọn thay thế.
1.2 Một số Website dùng Ruby on Rails
Github.com: Hệ thống quản lý source phân tán, được nhiều công ty lớn sử dụng,
và có hàng triệu người đang sử dụng trang web này như một nơi lưu trữ các dự án
của họ.
Basecamp.com: website quản lý dự án online, ra đời vào năm 2004, cho đến năm
2012 đã có hơn 8 triệu dự án được quản lý trên website này.
Twitter.com: là trang mạng xã hội lớn thứ 2 sau facebook, rất được sử dụng phổ
biến tại Mĩ và các nước châu Âu
Scibd.com: đây là trang web chia sẻ tài liệu trực tuyến lớn và nổi tiếng, có rất
nhiều tài liệu hay và miễn phí được chia sẻ tại đây.
4
Và một số website khác cũng nổi tiếng như hulu.com, hay slideshare.com, và
nhiều trang web khác.
1.3 Cài đặt Ruby on Rails
Bình thường để cài đặt Ruby on Rails bản phải cài đặt tất cả các phần sau:
1. Ruby
2. Rails
3. SQLite
4. Bundler
5. DevKit
Sau khi cài hết tất cả các phần trên bạn còn phải cài đường dẫn (nếu cần), tuy nhiên
điều này rất mất thời gian cũng như không hề dễ dàng.
Giải pháp đơn giản và nhanh chóng dành cho bạn là dùng gói cài đặt có đầy đủ tất
cả các thành phần cần thiết, chỉ việc cài đặt nó và bắt đầu xây dựng một ứng dụng
ROR: railsintaller.org, nó đã bao gồm những phần sau:
Ruby
Rails
Bundler
SQLite
DevKit
Git
TinyTDS
SQL Server Support
5
1.4 Công cụ phát triển
Sublime Text: là một editor có giao diện rất thân thiện cũng như thông minh, hỗ
trợ lập trình rất nhiều ngôn ngữ trong đó có Ruby (recommended).
JetBrains RubyMine: là một IDE đầy đủ tuy nhiên hơi nặng và cồng kềnh, hơn
một nửa cộng đồng Rails sử dụng nó, có bản FREE cho mục đích giáo dục hoặc
các dự án mã nguồn mở.
NetBeans: là một IDE quá nổi tiếng, hỗ trợ hầu như tất cả các ngôn ngữ cho các
dự án khác nhau, bạn chỉ cần cài plug-in cho Ruby on Rails để có thể bắt đầu phát
triển ứng dụng.
Aptana Studio: là một IDE đầy đủ các công cụ để phát triển Ruby on Rails, bạn
có thể cài đặt phiên bản standalone hoặc plug-in cho Eclipse.
Ngoài ra còn rất nhiều editor và IDE khác cho các môi trường khác nhau như
Linux, Windows, Mac.
2 Đặc trưng của Ruby on Rails
2.1 Các đặc trưng cơ bản
DRY – “Don’t Repeat Yourself” – không khuyến khích viết đi viết lại mã.
COC - Convention Over Configuration – Rails tạo những giả định về những gì bạn
muốn làm và bạn sẽ làm, thay vì bạn phải chỉ định tất cả mọi thứ qua những file
cấu hình.
Tạo ra các giả định về những thứ mà nhà phát triển muốn bắt đầu, độc đoán, giả
định đó là cách tốt nhất để làm việc
Ví dụ:
Rails đã định nghĩa sẵn thư mục mà bạn sẽ đặt stylesheets, images (/public), cũng
như các file JavaScript (/script) để nó có thể biên dịch chúng thành các file cached.
Đây là một tính năng tuyệt vời nếu bạn có nhiều tài nguyên JavaScript để quản lý,
nhưng hơi thừa nếu bạn làm việc với các ứng dụng nhỏ.
6
Khi bạn tạo một ứng dụng Rails mới, nó tự động tạo khoảng 10 thư mục cấp cao
với một số thư mục con, và tất cả các file .rb cũng được tạo sẵn. Nó cũng giả sử
rằng bạn cần một database. Điều đó chính là Convention. Nó có vẻ hơi phức tạp
nếu bạn chỉ xây dựng những site nhỏ nhưng đối với các site lớn thì sẽ rất tiện lợi.
2.2 Cấu trúc thư mục ứng dụng
File/Folder Purpose
app/
Chứa các controllers, models, views, helpers, mailers và
assets của ứng dụng.
script/
Chứa rails script để khởi động ứng dụng, và các script
khác để triển khai hoặc chạy ứng dụng.
config/ Cấu hình runtime rules, routes, database
config.ru
Cấu hình rack cho server được dùng để khởi động ứng
dụng.
db/ Chứa các database chema, migration hiện tại.
Gemfile
Gemfile.lock
Xác định những gem cần thiết cho ứng dụng. Những file
này được sử dụng bở Bindler gem
lib/ Các module mở rộng
log/ File log
public/ Chứa các file tĩnh và các asset được biên dịch
Rakefile Xác định vị trí và nạp các nhiệm vụ có thể chạy từ cmd.
7
File/Folder Purpose
Nên thêm các task vào thư mục lib/tasks thay vì thay đổi
Rakefile
RECOMMENTME.rdoc File giới thiệu ứng dụng của bạn, cách cài đặt
test/ Kiểm thử đơn vị
tmp/ Các file tạm thời (cache, pid, session)
vendor/ Mã nguồn của bên thứ 3.
2.3 Model – View – Controller
RoR sử dụng các mẫu kiến trúc Model – View – Controller(MVC) để tăng cường
khả năng bảo trì và phát triển của ứng dụng. MVC cho phép chúng ta chia ứng
dụng thành các tầng sử lý logic, nghiệp vụ và giao diện người dùng một cách rõ
ràng, điều này cũng gúp cho việc kiểm thử và tái sử dụng code được dễ ràng hơn.
2.4 Model
Tầng Model xử lý các nghiệp vụ của ứng dụng và trực tiếp thao tác với dữ liệu.
Trong RoR, tầng model thường được sử dụng để tương tác với các thành phần
tương ứng với chúng trong cơ sở dữ liệu và validate dữ liệu.
2.5 View
Tầng view hiển thị giao diện người dùng, trong RoR các view là các file HTML
được nhúng cùng với các đoạn mã Ruby. Các đoạn mã Ruby được nhúng trong
HTML file là khá đơn giản, thường chỉ gồm các vòng lặp và các lệnh điều kiện rẽ
nhánh, nó được sử dụng để hiện thị dữ liệu lên form của view.
8
2.6 Controller
Controller tương tác với model và view. Các request đến từ trình duyệt sẽ được xử
lý bởi controller, sau đó controller có thể sẽ tương tác với model để lấy dữ liệu sau
đó trả về cho view để hiển thị thông tin.
3 Định tuyến trong Ruby on Rails
3.1 Giới thiệu
Được định nghĩa trong file routes.rb
Một định tuyến cung cấp ánh xạ giữa các HTTP verbs (GET, POST, PATCH/PUT,
DELETE) và các URL đến các hành động (trong controller)
Theo quy ước mỗi hành động cũng ánh xạ đến từng CRUD (CREATE, READ,
UPDATE, DELETE) trong database.
Ví dụ:
resources :posts trong routes.rb tạo ra 7 tuyến đường khác nhau trong ứng dụng,
tất cả đều ánh xạ tới Posts Controller
Nếu Rails không tìm thấy posts/new template, nó sẽ gọi một template có tên là
application/new (Vì PostsController kế thừa từ ApplicationController)
HTTP Verb Path Action Used for
GET /posts index hiển thị danh sách post
GET /posts/new New/ trả về HTML form để tạo post mới
POST /posts create Tạo một post mới
GET /posts/:id show Hiện thị một post
GET /posts/:id/edit edit Trả về HTML form để edit post
PATCH/PUT /posts/:id update Update một post
DELETE /posts/:id destroy Xóa một post
9
3.2 Path và URL Helper
Để tạo ra một route cần dùng đến một số helper
Đối với resource :posts
posts_path trả về /posts
new_post trả về /posts/new
edit_post_path(:id) trả về /posts/:id/edit
post_path(:id) trả về /posts/:id
Mỗi helper có một _url helper tương ứng (ví dụ post_url) trả về đường dẫn hiện tại
3.3 Các tài nguyên lồng nhau
Thường có những tài nguyên là con của tài nguyên khác. Ví dụ, ứng dụng của bạn
có thể có:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
các route lồng nhau cho phép bạn có thể khai báo:
resources :posts do
resources :comments
end
resources :publishers do
resources :posts do
resources :comments
end
10
end
Ngoài định tuyến cho posts, khai báo trên cũng định tuyến comments đến
CommentsController.
Các URL của comment gửi yêu cầu đến post:
HTTP Verb Path Action Used for
GET /posts/:post_id/comments index
Hiển thị tất cả comment
của một post
GET /posts/:post_id/comments/new new
trả về một form HTML
để tạo comment của
một post nhất định
POST /posts/:post_id/comments create
tạo một comment thuộc
một post nhất định
GET /posts/:post_id/comments/:id show
hiển thị một comment
thuộc một post nhất
định
GET /posts/:post_id/comments/:id/edit edit
trả về một form HTML
để edit một comment
thuộc một post nhất
định
PATCH/PU
T
/posts/:post_id/comments/:id update
update một comment
nhất định thuộc một
post nhất định
DELETE /posts/:post_id/comments/:id destroy
xóa một comment nhất
định thuộc một post
nhất định
3.4 Tạo Path và URL từ Object
Rails có thể tạo đường dẫn và URL từ một mảng các tham số. Ví dụ, bạn có route
sau:
11
resources :posts do
resources :comments
end
Khi sử dụng post_comment_path, bạn có thể truyền vào một instance của Post và
Comment thay vì ID:
<%= link_to ‘Comment details’, post_comment_path(@post, @comment) %>
Bạn cũng có thể sử dụng url_for với một bộ object, và Rails sẽ tự động xác định
bạn muốn route nào:
<%= link_to ‘Comment details’ , url_for([@post, @comment]) %>
Trong trường hợp này Rails sẽ xem @post là một Post và @comment là một
Comment, vì thế nó sẽ sử dụng post_comment_path helper.
Đối với những hành động khác, chỉ cần thêm action làm phần tử đầu tiên của
mảng:
<%= link_to ‘Edit comment’, [:edit, @post, @comment] %>
4 Active Record là gì?
Active Record là một thành phần cơ bản và quan trọng của Framework Rails
cho phép điều khiển sự tương tác qua lại giữa các ứng dụng với DB và là bộ
phần trung tâm của Rails. Sử uyển chuyển của Active Record giúp cho chúng ta
rất nhiều trong việc thiết lập cấu hình ứng dụng.
Active Record trong mô hình MVC: là tầng Model của hệ thống, chịu trách
nhiệm đại diện cho business data và logic. Nó thuận tiện cho việc tạo và sử
dụng các business object được lưu trữ trong DB. Là 1 sự bổ sung cho Active
Record Pattern.
Trong Active Record , các đối tượng mang cả dữ liệu và hành vi hoạt động trên
dữ liệu đó, đảm bảo việc truy cập dữ liệu 1 cách logic, là một phần của đối
tượng sẽ dạy cho người dùng làm thế nào để đọc và ghi dữ liệu trong DB. Vì
thế, Active Record được xem như là một công cụ mạnh mẽ và hữu dụng. Thông
qua Active Record, bạn không cần phải khai báo các Primary Key hay Foreign
12
Key khi xây dựng DB, việc liên kết các bảng cũng có Active Record trợ giúp.
Khi có sự thay đổi, ta không cần phải thao tác với SQL mà chỉ cần thông qua
ngôn ngữ Ruby.
5 Object Relational Mapping (ORM)
ORM là cơ chế cho phép bạn xây dựng 1 ứng dụng (cụ thể là OOP-hướng đối
tượng) mà thao tác trên table trong database được đóng gói lại trong 1 business
class (vd: table Users tương ứng với class User), và không phải quan tâm nhiều
đến việc viết query cho mỗi lần truy xuất DB. Kỹ thuật ORM thích hợp trong
môi trường phát triển một hệ thống website mà trong đó cần tham gia nhiều
thành viên trong nhóm code và cho các hệ thống quy mô Enterprise.
Với ORM, bạn có thể sử dụng với nhiều hệ quản trị cơ sở dữ liệu khác nhau,
nó độc lập hoàn toàn, và thường các ORM trên thị trường hiện nay đều hỗ trợ
nhiều hệ quản trị cơ sở dữ liệu khác nhau, bạn chỉ cần thay đổi driver tương tác
là có thể làm việc một cách nhanh chóng mà không cần phải thay đổi bất kỳ
dòng code nào.
Một thế mạnh nữa của ORM, là bạn có thể thao tác truy cập, xử lý database
một cách dễ dàng và nhanh chóng. So với cách thông thường bạn phải sử dụng
các câu lệnh SQL để truy vấn và xử lý dữ liệu. Nhưng với ORM, bạn không
13
cần phải sử dụng SQL, mà chỉ cần thao tách, sử dụng các API đơn giản và dễ
dùng của nó để truy vấn và dữ lý dữ liệu
Với ORM Framework, bạn không cần dùng SQL để thao tác dữ liệu, vậy thì
làm sao để nó làm việc với database? Đó là do nó tự động gen ra các câu lệnh
SQL như Insert, Update, Delete, Select dữ liệu bên dưới database, nên bạn sẽ
khó hoặc có thể không can thiệp vào để tối ưu nó hơn. Tuy nhiên các ORM
Framework đều hỗ trợ bạn gọi câu lệnh SQL trực tiếp trong những tình huống
cần thiết.
Ngoài ra bạn còn phải gặp nhiều tình huống nan giải mà bất kì ai làm việc với
ORM cũng phải gặp qua: cách thức quản lý session truy xuất của ORM – nếu
bạn làm việc với Web project, lazy loading, tình huống load toàn bộ database
lên nếu không thiết kế đúng cách… Và khi đó hệ thống của bạn sẽ làm việc
một cách ì ạch.
6 Active Record như là một ORM Framework
Active Record cung cấp cho chúng ta các cơ chế, quan trọng là khả năng:
• Đại diện cho model và dữ liệu của chúng
• Đại diện cho sự liên kết giữa các model
• Đại diện cho các phân cấp kế thừa thông qua mô hình quan hệ
• Kiểm tra tính hợp lệ của của model trước khi chúng tồn tại trong DB
• Thực hiện các hoạt động cơ sở dữ liệu một cách hướng đối tượng
7 Quy ước về cấu hình trong Active Record
7.1 Quy ước đặt tên
Active Record sử dụng quy ước đặt tên để tìm hiểu cách thức ánh xạ giữa
các models và các bảng DB:
- Tên bảng là dạng số nhiều của tên model.
- Nếu tên model bao gồm nhiều từ (viết hoa ký tự đầu tiên của mỗi từ) thì
tên bảng tương ứng sẽ chứa các từ được cách nhau bởi dấu gạch dưới.
Ví dụ:
14
Model / Class Table / Schema
Post posts
LineItem line_items
Deer deers
Mouse mice
Person people
7.2 Quy ước về lược đồ (schema)
Active Record sử dụng quy ước đặt tên các cột trong bảng cơ sở dữ liệu tùy
thuộc vào mục đích của những cột này.
Foreign Key: cột này được đặt tên theo mô hình. Active Record sử dụng cột
này để tạo ra các liên kết giữa các bảng trong DB
Primary Key: mặc định Active Record sẽ sử dụng một cột số nguyên tên là
ID là khóa chính của bảng. Khi sử dụng Active Record Migration để tạo ra
các bảng, cột này sẽ được tự động tạo ra.
Ngoài ra còn một số tên cột tùy chọn sẽ thêm các tính năng của Active
Record:
Create_at: tự động thiết lập ngày và thời gian hiện tại khi một bản ghi được
ghi lần đầu tiên.
Update_at: tự động thiết lập ngày và thời gian hiện tại khi một bản ghi được
cập nhật.
8 Thao tác với Model
Chúng ta sẽ cần sử dụng đến Object của model Active Record. Để tạo ra một
model, ta sử dụng dòng lệnh trong cmd:
rails generate model Product
Rails sẽ tự động tạo ra cho ta một Object của model trong
app/models/product.rb.
Lúc này, nếu sử dụng chức năng tích hợp sẵn của Schema Migration thì ta sẽ
không cần sử dụng scrip SQL mà sẽ làm việc độc lập giữa DB và Schema, làm
15
giảm thiểu thao tác với DB mà không làm mất dữ liệu sau mỗi lần thay đổi
Schema.
Để sử dụng Schema Migration, ta thay đổi nội dung tập tin
db\migrate\*_create_products.rb
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.string :title
t.text :description
t.string :image_url
t.decimal :price
t.timestamps
end
end
def self.down
drop_table :products
end
end
Để thực thi gõ câu lệnh: rake db:migrate
Active Record sẽ khởi tạo 2 table: schema_info và products. Trong table
schema_info sẽ ghi lại verson của tập tin migration giúp quản lý các mã đã tạo
đồng thời vẫn giữ được thông tin đã lưu.
9 Console Rails
Là một tiện ích đi kèm với mỗi ứng dụng Rails, cho phép làm việc với các
model được liên kết với DB. Khi khởi động console, Rails sẽ thực hiện các
bước:
• Rails liên kết với DB
• Rails tải các class Active Record trong app/model
• Rails cho phép thao tác với model
Để khởi động Rails console, sử dụng lệnh: rails console
Thêm thông tin vào CSDL:
16
Photo = Photo.new
Photo.filename = “rails.jpg”
Photo.save
10 Cơ sở dữ liệu trong Rails
Những kiến thức liên quan đến cơ sở dữ liệu trong Rails:
• Column
Các khái niệm liên quan đến name, type, primary, giống như ngôn ngữ
SQL
• Accessors
Để thao tác với các cột trong 1 DB, ta chỉ cần gọi accessor như
photo.filename. Với chức năng này, Rails sẽ giúp thao tác tìm kiếm
CSDL dễ dàng hơn.
• Id
Thuộc tính ID là một thuộc tính đặc biệt trong Active Record vì mỗi cột
đều có một Primary Key dành cho mỗi table trong CSDL. Active Record
tự tạo cột ID và Primary Key dựa vào cột ID đó
• Method
17
• Finder
Active Record đã thêm vào 1 Finder dùng để làm công cụ tìm kiếm dữ
liệu dưới dạng find_by_<tên côt> vào mỗi class Model cho các cột trong
table
Ví dụ: tìm tập tin rails.jp trong table photos (class Photo) và xóa tập tin
đó, ta sử dụng như sau trong console của Rails:
photo.find_by_filename(“rails.jpg”).destroy
• Validate
Active Record còn có thể dùng để kiểm tra dữ liệu. Chẳng hạn, nếu muốn
kiểm tra dữ liệu có trong filename hay không, ta thay đổi tập tin
app/model/photo.rb như sau:
class Photo < ActiveRecord::Base
validate_presence_of :filename
end
Kiểm tra tính hợp lệ của dữ liệu đầu vào:
class Product < ActiveRecord::Base
attr_accessible :description, :image_url, :price, :title
validates :title, :description, :image_url, :presence => true
validates :price, :numericality => {:greater_than_or_equal_to =>
0.01}
validates :title, :uniqueness => true
validates :image_url, :format => {
:with => %r{\.(gif|jpg|png)$}i,
:message => 'must be a URL for GIF, JPG or PNG image.'
18
Method Active Record
Find_by_<tên cột> Active Record sẽ thêm 1 method vào trong mỗi
class được sử dụng đối với mỗi cột trong CSDL.
Ví dụ: thêm find_by_id, find_by_name vào class
tương ứng với mỗi table
Find_by_<tên
cột>_and_<tên
cột>
Active Record thêm giống trên nhưng được tổ hợp
dưới dạng như
Person.find_by_name_and_find_by_email
Attribute
<tên cột> Active Record tạo 1 attribute với nhiều method. Ví
dụ trong table photos có attribute filename =>
photo.filename = rails.jpg
}
end
• Validation
Active Record cho phép kiểm tra trạng thái của model trước khi viết vào
trong DB
Các method: kiểm tra rỗng, tính duy nhất, không có trong DB
11 Quản lý Relation với Active Record
Quản lý các relation là một trong những công việc quan trọng đối với mọi
Framework làm nâng cao hiệu suất làm việc giúp cho người dùng dễ dàng
tìm kiếm được thông tin cần thiết một cách nhanh chóng. Active Record lấy
một phần của ngôn ngữ Ruby và sử dụng cách đặt tên theo chuẩn làm đơn
giản hóa việc tương tác giữa các table với nhau trong CSDL.
Cú pháp sử dụng có dạng:
Relation :asociation :option1 => value, :option2 => value
• Relation: là một method được xác định bởi Active Record để tạo
relation giữa các table
• Association(s): được hiểu như một ký hiệu đặc biệt dành cho mỗi
relation được tạo
• Option: cũng như mọi method được sử dụng trong Ruby, mỗi relation
đều có thể có một hoặc nhiều option
Ví dụ:
has_many:
Là quan hệ một - nhiều
class Post > Active Record::Base
has_many :comment :order => time
belongs_to:
Là quan hệ nhiều - một. Ví dụ bảng post có quan hệ nhiều – một với bảng
comment, vì một post có thể chứa nhiều comment.
class Comment < ActiveRecord::Base
19
belongs_to :post
end
has_One:
Là quan hệ một – một. Ví dụ: Mỗi một hình ảnh trong table Photo ứng với
một đường dẫn tập tin trong table File
class Photo < ActiveRecord::Base
has_one :file
end
has_and_belongs_to_many:
Là quan hệ nhiều – nhiều (n-m). Ví dụ : có 2 bảng photo và category. Mỗi
một category có thể chứa nhiều photo khác nhau và mỗi một photo có thể
thuộc nhiều category khác nhau
class Photo < ActiveRecord::Base
has_and_belongs_to_many :categories
end
class Category < ActiveRecord::Base
has_and_belongs_to_many :photos
end
Join:
Rails cho phép kết nối dữ liệu giữa các table để tìm kiếm thông tin trong cơ
sở dữ liệu thông qua phép join giữa các table với nhau. Ta sẽ sử dụng cặp
has_many và belongs_to thông qua từ khóa through.
Ví dụ: liên kết 2 table slideshow và photo thông qua table slide
class Slideshow < ActiveRecord::Base
20
has_many :photo through => :silde
end
12 CRUD – đọc và ghi dữ liệu
CRUD là viết tắt của 4 toán tử: Create, Read, Update, Delete. Active Record
tự động tạo các phương thức cho phép ứng dụng có thể đọc và thao tác với dữ
liệu trong các bảng.
12.1 Create
Cho một model User với các thuộc tính name và occupation. Phương thức
create được gọi sẽ tạo và lưu 1 bản ghi vào trong CSDL.
user = User.create(name: "David", occupation: "Code Artist")
hoặc sử dụng phương thức new:
user = User.new
user.name = "David"
user.occupation = "Code Artist"
user.save
12.2 Read
Một số ví dụ về phương thức truy cập dữ liệu được cung cấp bởi Active
Record:
# return a collection with all users
users = User.all
# return the first user
user = User.first
# return the first user named David
david = User.find_by(name: 'David')
# find all users named David who are Code Artists and sort by created_at in
reverse chronological order
users = User.where(name: 'David', occupation: 'Code
Artist').order('created_at DESC')
21
12.3 Update
Khi một đối tượng được truy xuất, các thuộc tính của nó có thể được sửa đổi
và lưu vào trong CSDL.
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save
hoặc
user = User.find_by(name: 'David')
user.update(name: 'Dave')
Để update một lượng lớn các bản ghi, bạn có thể sử dụng phương thức
update_all:
User.update_all "max_login_attempts = 3, must_change_password = 'true'"
12.4 Delete
user = User.find_by(name: 'David')
user.destroy
13 Active Record Migrations
Migrations là một tính năng cua Active Record cho phép bạn phát triển các giản
đồ cơ sở dữ liệu theo thời gian. Thay vì sửa đổi trong lược đồ quan hệ SQL,
Migrations cho phép sử dụng dễ dàng Ruby DSL để mô sự thay đổi trên các
bảng.
Tạo một Migration sử dụng câu lệnh:
rails generate migration <tên bảng> [<cột1>:<kiểu1> <cột 2>:<kiểu2> ]
Ví dụ: Để tạo 1 bảng Products với các trường title, description, image_url,
price gõ câu lệnh:
$ rails generate migration products title :string description :string image_url
:string price :decimal
Hoặc có thể truy cập file db/migrate/*create_products.rb và sửa nội dung:
class CreateProducts < ActiveRecord::Migration
def change
create_table :products do |t|
t.string :title
t.string :description
t.string :image_url
t.decimal :price
22
t.timestamps
end
end
end
Nếu như tên của Migration có dạng “AddXXXToYYY” or
“RemoveXXXFromYYY” và theo sau đó là một danh sách các cột và kiểu thì một
Migration chứa các câu lệnh add_column và remove_column được tạo ra.
$ rails generate migration AddPartNumberToProducts part_number:string
Sẽ tạo ra:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
add_index :products, :part_number
end
end
rails generate migration RemovePartNumberFromProducts part_number:string
Sẽ tạo ra:
class RemovePartNumberFromProducts < ActiveRecord::Migration
def change
remove_column :products, :part_number, :string
end
end
Nếu tên của Migration có dạng “CreateXXX” và theo sau là 1 danh sách các cột và
kiểu thì một Migration tạo bảng XXX chứa các cột sẽ được tạo ra
rails generate migration CreateProducts name:string part_number:string
Tạo ra:
class CreateProducts < ActiveRecord::Migration
def change
create_table :products do |t|
t.string :name
23
t.string :part_number
end
end
end
14 Giới thiệu về Scaffolding
Scaffolding là một công cụ mạnh mẽ giúp khởi tạo một cách nhanh chóng giao
diện người dùng, được sử dụng như là một bước khởi đầu đầy lợi thế cho việc
phát triển ứng dụng.
Dòng lệnh để tạo Scaffold:
rails generate scaffold <tên model>
Khi sử dụng Scaffold, Rails sẽ tự động tạo controller có tên theo kiểu tên số
nhiều của model và thêm vào controller những method sau:
Method Chức năng
index Hiển thị trang chủ, là một view liên kết với CSDL
new HIển thị mọt view tạo dữ liệu mới
edit(id) Chỉnh sửa dữ liệu
show(id) Hiển thị kết quả một tập dữ liệu
create Tạo một dữ liệu mới
update(id) Cập nhật dữ liệu
destroy Xóa dữ liệu
15 Đánh giá
Vì Rails được xây dựng bằng Ruby nên nó kế thừa những điểm mạnh và điểm yếu
của ngôn ngữ này. Ruby là một ngôn ngữ script với cú pháp trong sáng ,dễ đọc, dễ
hiểu và là ngôn ngữ hướng đối tượng. Vì nó là ngôn ngữ thông dịch nên nó chạy
chậm hơn các ngôn ngữ biên dịch khác nhứ Java,C++ hay C. Trong nhiều trường
hợp, sự khác biệt một chút về tốc độ không phải là vấn đề đáng bận tâm nhưng khi
mà ứng dụng web phục vụ hàng triệu người dùng tại cùng một thời điểm thì khi đó
vấn đề hiệu năng lại là vẫn đề sống còn. Ruby không phù hợp cho các ứng dụng
đòi hỏi hiệu năng cao bởi vì nó được xây dựng không dùng cho việc tối ưu hóa tốc
24
độ, nó được thiết kế với mục đích là đơn giản hóa, dễ sử dụng, và có thể phát triển
ứng dụng một cách nhanh chóng. Ruby không hỗ trợ tốt về thread, giống như các
ngôn ngữ script khác, Ruby gặp khó khăn khi giải quyết các tiến trình có thời gian
sống lâu, trong khi đó các ngôn ngữ như Java , C# được hỗ trợ về Thread rất tốt
bởi vì chúng đã được tối ưu hóa các quá trình xử lý thread trong nhiều năm liền,
một điểm yếu khác chính là vấn đề quản lý bộ nhớ, bộ thu gom rác của Ruby hoạt
động không tốt như bộ thu gom rác của Java, bởi vì với Ruby,thậm chí bộ nhớ
không có khái niệm về vùng nhớ Heap, và Stack nên việc giải phóng bộ nhớ chậm
hơn các ngôn ngữ khác như Java, C,C++. Một điều nữa, việc Rails hỗ trợ cho các
nhà phát triển quá nhiều và bắt ứng dụng của chúng ta phải tuần theo những quy
ước và mô hình MVC, theo đúng ý nghĩa tên của Framework “on rails way” cũng
gây ra những mặt trái của nó, sẽ là khó khăn nếu chúng ta phát triển tiếp một ứng
dụng mà nó đã được xây dựng bằng một ngôn ngữ khác, với các cơ sở dữ liệu đã
có trước , với một mô hình khác bằng RoR.
Mặc dù có một vài điểm yếu, nhưng chúng ta cũng phải thừa nhận những điểm
mạnh mà RoR có được trong khi các framework khác thì không, kiến trúc RoR đã
chấp nhận hi sinh sự mềm dẻo trong khai báo các file cấu hình bằng viêc tuân theo
những quy ước nhằm tận dụng khả năng hỗ trợ từ Framework, do vậy RoR phù
hợp cho việc phát triển từ đầu các ứng dụng vừa và nhỏ, yêu cầu thời gian phát
triển ngắn dễ bảo trì, dễ đọc hiểu, không đòi hỏi hiệu năng cao.
25