Thứ Sáu, 12 tháng 9, 2014

Model - Kiểm tra tính hợp lệ của dữ liệu nhập trong Model của Ruby on Rails

Vào Model Class \app\models, mở file model_name.rb tương ứng mới Model cần kiểm tra dữ liệu nhập.
class Article < ActiveRecord::Base
  validates :title, :presence => true
  validates :body, :presence => true
end

Các phương thức kiểm tra tính hợp lệ được tích hợp sẵn trong Model gồm có:
:presence => true # bắt buộc phải có
:uniqueness => true # phải là duy nhất
:confirmation => true # phải được kiểm tra trùng khớp
:acceptance => true # người dùng phải đồng ý để tiếp tục
:massage => "thông báo khi có lỗi trả về" # thông báo chuỗi string nếu có lỗi xảy ra
:on =>:create # default là :save, string tra về nếu thành công
:minimum
:maximum
:is
:within
:allow_nil
:too_long
:too_short
:wrong_length
:numericality
:inclusion
:exclusion
:acceptance

Ví dụ:
validates :email, :uniqueness => true, :length => { :within => 5..50 }, :format => { :with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i }

validates :password, :confirmation => true

Model - Các phương pháp tìm kiếm database trong một Model của Ruby on rails

Mỗi Model trong RoRs được map với một Database table tương ứng trong cơ sở dữ liệu SQline, mySQL...
RoRs đã xây dựng sẵn những method giúp chúng ta dễ dàng tim kiếm ( lọc ) dữ liệu trong database theo những yêu cầu tìm kiếm. Vấn đề cần nhấn mạnh ở đây là: Đâu là phương pháp tìm kiếm bảo mật nhất ? Phương pháp phải ngăn ngừa SQL injection.
SQL injection: có thể hiểm ngắn gọn là việc người dùng truy vấn những dữ liệu nhạy cảm trong cơ sở dữ liệu của Website thông qua Request URL nhập vào thanh địa chỉ của trình duyệt.

Cách 1: sử dụng phương thức where.
- Vào mode console trong Rails: $ rails console
>> Article.where(:title => 'Advanced Active Record')
Ta đã biết Model Article sẽ map với Database Table tên articles, câu truy vấn trên sẽ lọc dữ liệu trong Table article trên tất cả các dòng ( Row ) mà trường title có tên là Advanced Active Record.

Cách 2: sử dụng SQL Fragment
>> Article.where("title = 'Advanced Active Record'") # tương tự cách 1.
>> Article.where("created_at > '23-03-2010' OR body NOT LIKE '%model%'")
Dòng lệnh trên tìm kiếm trong Database Table article các dòng dữ liệu thoả mãn đồng thời 2 điều kiện.

  1. Trường created_at có ngày tháng năm sau ngày 23-03-2010.
  2. Trường body chứa nội dung trong đó có chữ model.

Ghi chú: % còn gọi là ký hiệu widecard, đại điện cho bất kỳ ký tự nào dứng trước vào sau từ model.

Cách 3: Using an Array Condition Syntax ( là cú pháp chuỗi điều kiện )
Đây là phương pháp mà RoRs kiến nghị chúng ta sử dụng để chống lại SQL injection và các malicious user:
>> Article.where("published_at < ?", Time.now)

>> Article.where("published_at < ?", Time.now).to_sql => "SELECT \"articles\".* FROM \"articles\"
WHERE (published_at < '2010-05-02 16:27:51.059277')"


>> Article.where("created_at = ?", Article.last.created_at)

>> Article.where("created_at = ? OR body LIKE ?", Article.last.created_at, 'model')

Các bạn có thể thay thế dấu "?" bằng một tham số biến nào đó, sau đó dùng một array để định nghĩa các biến theo các cặp :key => 'key_value'. Ưu điển cùa cách này giúp bạn không cần bận tâm thứ tự các điều kiện cũng như có rút gọn chuỗi tìm kiếm nếu như một điều kiện được lặp lại nhiều lần.

>> Article.where("title LIKE :search OR body LIKE :search",
{:search => '%association%'})

Cách 4: Tìm kiếm theo một chuỗi phương thức liên kết ( Association Proxies ) dưới sự hỗ trợ của Active Record
>> User.first.articles.all
>> current_user.articles.create(:title => 'Private', :body => ‘Body here..’)
Một số Method hữu ích khác của Active Record:
where(conditions); order; limit; joins; includes
Ví dụ ta có Model Article đã được tạo trong RoRs
Article.where("title =
'Advanced Active Record'")

Article.order("published_at
DESC")

Article.limit(1)

Article.joins(:comments)

Article.includes(:comments)

Thứ Năm, 11 tháng 9, 2014

Model - Các kiểu dữ liệu trong Database Table của Model trong Ruby on Rails

Ví dụ về cách tạo một Model tên Profile có các trường user_id, name, birthday, bio, color, twitter trong RoRs.
$ rails generate model Profile user_id:integer name:string birthday:date
bio:text color:string twitter:string


Ruby on Rails (ActiveRecord migration) hỗ trợ các loại dữ liệu (datatypes )sau đây:
  • :binary
  • :boolean
  • :date
  • :datetime
  • :decimal
  • :float
  • :integer
  • :primary_key
  • :references
  • :string
  • :text
  • :time
  • :timestamp
Giải thích chi tiết về các kiểu dữ liệu:
  • String:
    • Limited to 255 characters (depending on DBMS)
    • Use for short text fields (names, emails, etc)
  • Text:
    • Unlimited length
    • Use for comments, blog posts, etc. General rule of thumb: if it's captured via textarea, use Text. For input using textfields, use string.
  • Integer
    • Whole numbers
  • Float:
    • Decimal numbers stored with floating point precision
    • Precision is fixed, which can be problematic for some calculations; generally no good for math operations due to inaccurate rounding.
  • Decimal:
    • Decimal numbers stored with precision that varies according to what is needed by your calculations; use these for math that needs to be accurate
    • See this post for examples and an in-depth explanation on the differences between floats and decimals.
  • Boolean
    • Use to store true/false attributes (i.e. things that only have two states, like on/off)
  • :primary_key
    • This datatype is a placeholder that Rails translates into whatever primary key datatype your database of choice requires (i.e. serial primary key in postgreSQL). Its use is somewhat complicated and not recommended.
    • Use model and migration constraints (like validates_uniqueness_of and add_index with the:unique => true option) instead to simulate primary key functionality on one of your own fields.
  • Date:
    • Stores only a date (year, month, day)
  • Time:
    • Stores only a time (hours, minutes, seconds)
  • DateTime:
    • Stores both date and time
  • Timestamp
    • Stores both date and time
    • Note: For the purposes of Rails, both Timestamp and DateTime mean the same thing (use either type to store both date and time). For the TL;DR description of why both exist, read the bottom paragraph.

Model - Các bước khai báo một Model trong Ruby on Rails

Một Model trong RoRs thường muốn nói đến mối liên quan đến Model_Class của chính nó. Mỗi Model được Map ( liên kết ) với một Database Table tương ứng.
Nhắc lại: Tên Model viết Chữ Hoa chữ cái đầu và phải ở số ít trong Tiếng Anh. Sau khi khai báo Model xong thì RoRs sẽ tự động tạo ra một Database Table tương ứng có tên giống tên Model nhưng được viết thường và ở số nhiều.
Sau đây là 3 bước cơ bản trong việc khai báo Model mới trong RoRs.

Bước 1: Khai báo Model và cấu trúc dữ liệu Database Table cho Model

- Vào môi trường Command Line ( Git Bash )

- Vào Module tương ứng
$ cd TenModule # cũng là một thư mục

- Khai báoModel mới tên User
$ rails generate model User email:string password:string # Model tên User
Sau dòng lệnh trên RoRs sẽ tự động sinh ra một Database Table tên users, trong Table users mỗi Row ( hàng ) sẽ có 2 trường dữ liệu, trường thứ nhất tên email có kiểu dữ liệu là string, trường thứ hai tên password có kiểu dữ liệu cũng là string.

Mỗi Model tạo ra trong RoRs sẽ liên hệ đến một Class chứa trong \app\models\TenModel.rb. Class có nội dung sau:
class User < ActiveRecord::Base
end

Đồng thời thông tin khai báo Database Table users cũng như các trường dữ liệu email, password sẽ thể hiện trong file \db\migrate\day_so_xxx.create.users.rb. Nội dung file này là:
class CreateUsers < ActiveRecord::Migration 
  def self.up 
    create_table :users do |t| 
      t.string :email 
      t.string :password 
 [...Bổ Sung Trường Dữ Liệu ...]
      t.timestamps 
    end 
  end 
  def self.down 
    drop_table :users 
  end 
end 

Việc tạo ra Database Table users sẽ do Class tên CreateUsers đảm nhiệm ( đây chính là bước chủa bị của RoRs ). Đến thời điểm này thì Database Table users vẫn chưa chính thực tạo ra. Nó chỉ được tao ra khi chúng ta thực hiện bước tiếp theo. Tại thời điển này, các bạn hoàn toàn có thể bổ sung các trường dữ liệu mới cho Table users ngay tại  [...Bổ Sung Trường Dữ Liệu ...] 

Chú ý: Khi một Database Table của một Model được khỏi tạo thì có 1 trường dữ liệu được RoRs tạo ra theo mặc định đó là id.
id: Dùng làm khoá chính của Database Table. Bất kỳ Database Table nào cũng có khoá chính này.

Bước 2: Chính thức tạo ra Database Table users trong Database.
$ rake db:migrate # chạy tất cả các file trong thư mục \app\models\
Sau dòng lệnh này thì Class CreateUser trong file \db\migrate\day_so_xxx.create.users.rb được chạy để khởi tạo Database Table users cho Model User.

Bước 3: Khai báo quan hệ giữa Model với các Model con của nó. 
Vào trong Class của Model vừa tạo bằng cách mở file \app\models\TenModel.rb. Nội dung ban đầu:
class User < ActiveRecord::Base
end
Bổ sung quan hệ với các Model con của nó vào trong Class trên như sau:
class User < ActiveRecord::Base
has_one :profile 
end

Vậy. với việc bổ sung dòng code has_one :profile ta đã khai báo cho RoRs biết, Model User có một Model con tên Profile, với mối quan hệ has_one. Và Database Table của Model Profile phải được khai báo một trường dữ liệu tên user_id được xem như một khoá ngoại ( Primary_key ) liên kết với Database Table users của Model User.

Chú ý: KHi cần khai báo một Model là con của Model User. Trong ví dụ này là Model Profile
Khai báo Model Profile như sau:
$ rails generate model Profile user_id:integer name:string birthday:date
bio:text color:string twitter:string
Khai báo Model Profile là con của Model User
Mở file \app\models\profile.rb. Bổ sung dòng code belongs_to :user
class Profile < ActiveRecord::Base
belongs_to :user
end

Các mối quan hệ được khai báo có thể là ( gồm 1 hay nhiều ):
has_one 
has_many 
belongs_to 
has_and_belongs_to_many 

Model - Quan hệ giữa Model -Database Table - Foreign Key trong Ruby on Rails


Mỗi Model trong RoRs sẽ có một khoá ngoại liên kết đến Database Table của nó. Tên của khoá ngoại này theo quy ước là TênModel_id
Bất kỳ Model nào là con của Model_Cha, thì trong Database Table của nó sẽ chứa khoá ngoại của Model cha. Khoá ngoại này sẽ được khai báo khi tạo Model con.

1. Khai báo quan hệ giữa 2 Model với nhau:
Việc này được thực hiện trong Model Class Cha tại thư mục Module_Name\app\models file ModelName.rb. Ví dụ

class Message < ActiveRecord::Base 
  has_many :attachments 
end 
Model Cha tên Message có một Model Con tên Attachment. Mối quan hệ has_many nghĩa là 1 Row trong Database Table messages của Model Message sẽ liên kết với nhiều Row trong Datatable attachments của Model Attachment.

Các mối quan hệ được khai báo có thể là ( gồm 1 hay nhiều ):
has_one 
has_many 
belongs_to 
has_and_belongs_to_many 

=> Tham khảo Các bước khai báo một Model trong Ruby on Rails.

Thứ Tư, 10 tháng 9, 2014

Model - Phương thức tìm kiếm find () dữ liệu trong Model của Ruby on Rails

find(:id)
find(:all)
find(:first)
find(:last)

page 83

Model - CRUD là gì trong RoRs

CRUD: Create, Read, Update, Delete. Được tích hợp sẵn trong Active Record của RoRs.
article=Article.new # Tạo mới objects article từ Class Article
article.new_record # Kiển tra objects đã lưu chưa true/false
article.attributes # Kiểm tra các thuộc tính và giá trị thuộc tính của Object article hiện hành
Ghi thông tin vào các Artributes
article.title='Title for this article'
article.body='Body content of this article'
Truy xuất để kiểm tra thông tin đã ghi
artical
Lưu thông tin
article.save
Đếm số lượng record trong model ArticleArticle.count
Tạo và lưu một Object
Cách 1:
article = Article.new(:title => "Introduction to Active Record",  
:body => "Active Record is Rails's default ORM..", :published_at => Date.today)
>> article.save
Cách 2:Article.create(:title => "RubyConf 2010", :body => "The annual RubyConf will 
take place in..", :published_at => '2010-05-19') 

Chú ý: 
article.title='something' tương đương với article.title=('something'). title=() là một phương thức