IT Staff

Blog về chuyên ngành IT

Tạo dữ liệu demo nhanh với thư viện Faker

leave a comment »

Article: Tạo dữ liệu demo nhanh với thư viện Faker 1467

me.yahoo.com/hongphuongit 1
Updated about 1 year ago

Khi làm project, thường ta cần nhiều dữ liệu có sẵn để thử nghiệm, giúp việc code thêm chính xác và nhanh chóng. Ruby có thư viện Faker giúp ta làm việc này dễ dàng. Trong bài này tôi sẽ giới thiệu về cách sử dụng thư viện này (chắc không thừa cho các bạn mới tập code với ngôn ngữ Rails) {#emotions_dlg.laughing}.

Những câu hỏi thông thường được đặt ra khi mới làm quen với Faker

  1. Faker là gì?
  2. Tại sao phải sử dụng Faker, nó hữu ích như thế nào?
  3. Để sử dụng Faker, phải làm như thế nào?

Đáp án cho những câu hỏi trên

Câu 1

Faker là một trong những thư viện có thể tích hợp trong Ruby/Rails để tạo dữ liệu giả rất nhanh và tiết kiệm nhiều thời gian, giúp việc coding khi cần dữ liệu để test một cách dễ dàng.

Câu 2

Vì faker là bộ thư viện nhỏ, gọn và có thể tương thích install trong Ruby/Rails. Để sử dụng được bộ thư viện này chúng ta cần cài đặt Faker:

 # start/run/gõ cmd 1- gem install faker 2- gem -v 3- gem update --system 4- gem server

Giải thích:

  • Dòng 1: cài đặt Faker
  • Dòng 2: kiểm tra version của gem xem có mới hay không, gem cũ quá thì không chạy được dòng 4
  • Dòng 3: nâng cấp gem lên phiên bản mới nhất
  • Dòng 4: bật server của gem để tham khảo tài liệu của Faker, có thể tham khảo và tra cứu các kiểu của dữ liệu trong thư viện Faker trực tiếp trên máy của mình mà không cần vào Internet

Câu 3

Tạo dữ liệu hàng loạt sử dụng thư viện Faker:

# projects/lib/tasks/db_demo.rake namespace :db do desc 'add demo data' task :demo => :environment do require 'faker' 100.times do Project.create( :name => Faker::Name.name, :address => Faker::Address.street_address, :email => Faker::Internet.email ) end end end # projects/app/models/project.rb class Project < ActiveRecord::Base end 

Lưu ý: không nên đặt dòng require ‘faker’ lên đầu file . Vì nếu để dòng này ở đầu file thì nó sẽ bị load khi chạy bất kỳ task nào, mục đích của mình chỉ muốn tạo dữ liệu giả hàng loạt một lần duy nhất khi chạy file này thì không nên require ‘faker’ lên đầu file {#emotions_dlg.smile}.

Chạy file này để tạo dữ liệu vào projects của mình:

# start/run/gõ cmd # path your project rake db:demo 

Vào chương trình admin của cơ sở dữ liệu bạn dùng (ví dụ tôi dùng phpmyadmin cho MySQL) sẽ thấy dữ liệu tạo ra “rất đẹp” và như ý  {#emotions_dlg.wink}.

Một số lưu ý khi sử dụng thư viện Faker nói riêng và sử dụng thư viện tạo dữ liệu nói chung

Thông thường bất kỳ thư viện tạo dữ liệu có sẵn nào đều có những dữ liệu cần cho loại dabatabase này nhưng loại database khác thì không cần (rất hiếm, vì đa số các loại thư viện đều tích hợp và tạo ra những dữ liệu thường sử dụng nhất: name, address, email, phone…). Nếu sử dụng Faker trong Rails thì ta xử lý chỗ này như thế nào? Ngòai ra tạo khóa cho các bảng có liên quan như thế nào để tạo ra dữ liệu đúng, chính xác thì làm sao?

Dưới đây là ví dụ minh họa.

Tạo dữ liệu giả mình cần mà Faker không hỗ trợ sẵn

# projects/lib/tasks/db_demo.rake namespace :db do desc 'add demo data' task :demo =>environment do require 'faker' 100.times do Student.create( :name => Faker::Name.name, :birth => Time.now :male => (rand(2) == 0)? true : false ) end end end end # projects/app/models/student.rb class Student < ActiveRecord::Base end 

Tạo dữ liệu giả hàng loạt với nhiều bảng (có quan hệ tới khóa chính và khóa ngoại)

Ta có 2 bảng dữ liệu: sản phẩm và loại sản phẩm (một sản phẩm thì thuộc lọai sản phẩm nào đó).

# projects/lib/tasks/db_demo.rake namespace :db do desc 'Add deomo data' task :demo => :environment do require 'faker' # Tạo dữ liệu cho khóa chính (trước) KINDS = ['big', 'medium', 'small', 'very small'] KINDS.each do |k| Kind.create(:name => k) end # Tạo dữ liệu cho khóa ngoại (sau) 100.times do Product.create( :name => Faker::Name.name, :price => rand(1000), :kind_id => rand(KINDS.size) + 1 ) end end end # projects/models/app/kind.rb class Kind < ActiveRecord ::Base end # projects/models/app/product.rb class Product < ActiveRecord::Base belongs_to :kind end

Tôi thường sử dụng Faker trong Rails để tạo dữ liệu giả hàng loạt. Các bạn có những cách sử dụng hoặc biết thư viện nào khác xin chia sẻ kinh nghiệm cho mọi người cùng tham khảo và học hỏi {#emotions_dlg.wink}.

Với Rails3 việc tạo dữ liệu giả với thư viện Faker có vẻ dễ dàng và gọn nhẹ hơn

Với Rails3 thì khi tạo mới một project sẽ có một số file tự phát sinh hơi khác so với version cũ.  Và Tôi nghĩ rằng đã có nhiều người đã xài thử và Tôi cũng vậy, khi xài Rails3 thì quả thậy không biết nói gì hơn là very Great so với version cũ nhỉ {#emotions_dlg.cool}. Quay lại vấn đề tạo dữ liệu giả của chúng ta là các bạn chỉ cần quan tâm đến 2 files (db/seeds.rb và Gemfile)

Ví dụ: (Tôi lấy lại ví dụ trên)

# db/seeds.rb 100.times do Student.create( :name => Faker::Name.name, :birth => Time.now :male => (rand(2) == 0)? true : false ) end # Gemfile gem 'faker', '0.3.1' <-- faker's version 

Sau đó bạn gõ lệnh sau để thực thi việc tạo dữ liệu giả vào DB của bạn như sau:

rake db:seed

Lưu ý: Việc tạo thêm nhiều table nhiều lần, cũng đồng nghĩa với việc tạo nhiều lần dữ liệu giả. Vì vậy ở lần khác 1 chạy file db/seeds.rb thì bạn nên chạy lệnh sau( ý nghĩa của lệnh này là chỉ chạy những gì thay đổi (cái mới) trong file seeds.rb mà thôi, những gì cũ đã chạy rồi thì có thể bỏ qua khỏi phải mất thời gian và dữ liệu có thể trùng lặp(nếu gán cứng dữ liệu giả))

rake db:setup

Bạn không cần phải tạo file db_demo.rake nữa và phải đắn đo xem nên đặt dòng require ‘faker’ ở vị trí nào tiện nhất trong file…mất thời gian {#emotions_dlg.tongue_out}.

Comments

ngocdaothanh.myopenid.com 176
over 3 years ago

Đánh cờ quan trọng là khai cuộc.

Giả sử đã phân tích yêu cầu và thiết kế đại khái xong, khi bắt tay vào viết chương trình Rails, nên theo qui trình sau:

  1. Viết migration (rake db:migrate).
  2. Viết models (class nằm trong thư mục models).
  3. Viết task để sinh dữ liệu giả (rake db:demo).
  4. Viết index và show.
  5. Ngon lành mới viết tiếp sang các action còn lại.

Written by Xavier

Tháng Tám 3, 2013 lúc 9:58 sáng

Posted in RoR, Ruby

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: