Author Topic: Active_Record  (Read 584 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
Active_Record
« on: October 26, 2008, 06:01:25 PM »

ActiveRecords
انشئ قاعدة بيانات باسم phonerdb_development وفيها جدول كالتالي
Code: [Select]
 users (id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(55) UNIQUE, phonenum VARCHAR(10)

ال ActiveRecords تسمح لك بأنك تعالج الجدول بدون استخدام SQL ولكن بإستخدام ال OO
هنا بمجرد أنك تستخدم ActiveRecord سيتم التعامل مع الجدول الخاص بال users عن طريق Model (Ruby Class)

 الكلام جميل، ماذا عن الفعل ؟
( شكلك داخل سخن شوية :D )
1- اعمل Import لل active record كالتالى
Code: [Select]
require 'active_record' 

2- اضبط الإعدادات الخاصة بالإتصال عن طريق  ActiveRecord::Base.establish_connection كالتالى
Code: [Select]
ActiveRecord::Base.establish_connection( 
  :adapter  => 'mysql',
  :host     => 'localhost',
  :username => 'root',
  :password => PASSWORD_GOES_HERE,
  :database => 'phonerdb_development'
  
  )

هنا حددنا ال
adapter الذي سنعمل به سواء mysql او postgres او غيرها
host وهو يعبر عن مكان الخادم
usernameوpassword لإنشاء الإتصال
database قاعدة البيانات التى سيتم الإتصال معاها

تمام، لا ينقص إلا كتابةModel الذي سيتعامل مع ال Table كالتالى
Code: [Select]
#Mapping/Validating. 
class User < ActiveRecord::Base
  validates_numericality_of :phonenum
  validates_uniqueness_of   :name
  validates_presence_of     :name
  validates_presence_of     :phonenum
  
end

فقط!
أين اسم ال table ؟!
هممم الإجابة ان Ruby/ActiveRecords ذكيين كفاية ليعرفوا أن الجدول هو جمع User يعنى users
CoC #Convention over configuration

تستطيع أن تحدد الجدول طبعا يدويا باستخدام set_table_name  كالتالي مثلا
Code: [Select]
class User < ActiveRecord::Base 
  set_table_name("users")
  validates_numericality_of :phonenum
  validates_uniqueness_of   :name
  validates_presence_of     :name
  validates_presence_of     :phonenum
  
end


جيد، تعالى نشوف السحر الذي أخبرتك عنه !!

*اضافة user
Code: [Select]
def add_user(username, phone) 
  user=User.new
  user.name=username
  user.phonenum=phone
  user.save! #throws an exception.
end


كل ما عليك هو انك تنشئ object من ال User class وتحدد قيمته في كل عمود،  فى مثالنا هنا ال name وال phonenum
وتعمل save!  بدل من insert statement أليس هذا أسهل ؟

*عرض بيانات user
Code: [Select]
def display_user(user) 
  puts "--------------------"
  puts "ID: #{user.id.to_s}"
  puts "Name: #{user.name}"
  puts "Phone: #{user.phonenum}"
  puts "--------------------"
end

*البحث
Code: [Select]
def find_user(username) 
  #Limit to 1.
  user=User.find(:first, :conditions =>["name=?", username])
  #u may use User.find_by_name method. god bless reflection :)
  #user=User.find_by_name(username)

 
  return user
end

هنا نحتاج لوقفة،  انت تستطيع أن تستخدم
Code: [Select]
  user=User.find(:first, :conditions =>["name=?", username]) 

هنا سيرجع أول سجل سيقابله بحيث ان ال name يساوى ال username المطلوب
وتستطيع أيضا أن تستخدم ميزة رائعة
Code: [Select]
user=User.find_by_name(username) 

كيف عرفت أن اسم column بإسم name  ؟ هممم راجع ال reflection :)

*تحديث مستخدم
Code: [Select]
def update_user(username, newphone) 
  user=find_user(username)
  user.phonenum=newphone
  user.save!
end


ستحصل على ال object المطلوب بإستخدام عملية find بإستخدام الدالة التي كتبناها find_user وتعدل عليه وتعمل save! وتم الحفظ فى الجدول :D

*عرض الكل
Code: [Select]
def select_all 
  User.find(:all){|user|
    yield user
  }
end

هنا لن يتم العرض ولكن سيحصل yield كل record لاستخدامه فى display_user بصورة مناسبة

*حذف
Code: [Select]
def delete_user(username) 
  user=find_user(username)
  user.destroy
  puts "Deleted!"
end

احصل على object واستدعى ال destroy method الخاصة به

*حذف الكل
Code: [Select]
def delete_all 
  User.delete_all
end


تستطيع أن تحدد conditions طبعا فى عملية الحذف الجماعى :)
اخيرا استغل كل مافى الmodule كالتالى مثلا
Code: [Select]
def get_user 
  print("Username: ")
  return gets.chomp!
end

def get_phone
  print("Phone: ")
  return gets.chomp!
end



def entry_point

   mnu=<<M
  1-Add User
  2-Delete User
  3-Update
  4-View All
  5-Clear
  6-Quit

M
  while true
    puts mnu
    opt=gets.chomp.to_i
    if not (1..6).include?(opt)
      puts "Unknown Option"
    end
    if opt==1
      add_user(get_user, get_phone)
    elsif opt==2
      delete_user(get_user)
    elsif opt==3
      update_user(get_user, get_phone)
    elsif opt==4
      for user in select_all
        display_user(user)
      end
    elsif opt==5
      delete_all
    elsif opt==6
      exit
    end
  end
  
end

entry_point


( وبس كدا :D )

« Last Edit: October 26, 2008, 06:14:03 PM by Ahmed Youssef »
Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/