ActiveRecords
انشئ قاعدة بيانات باسم phonerdb_development وفيها جدول كالتالي
users (id INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR(55) UNIQUE, phonenum VARCHAR(10)
ال ActiveRecords تسمح لك بأنك تعالج الجدول بدون استخدام SQL ولكن بإستخدام ال OO
هنا بمجرد أنك تستخدم ActiveRecord سيتم التعامل مع الجدول الخاص بال users عن طريق Model (Ruby Class)
الكلام جميل، ماذا عن الفعل ؟
( شكلك داخل سخن شوية

)
1- اعمل Import لل active record كالتالى
2- اضبط الإعدادات الخاصة بالإتصال عن طريق ActiveRecord::Base.establish_connection كالتالى
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 كالتالى
#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 كالتالي مثلا
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
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
def display_user(user)
puts "--------------------"
puts "ID: #{user.id.to_s}"
puts "Name: #{user.name}"
puts "Phone: #{user.phonenum}"
puts "--------------------"
end
*البحث
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
هنا نحتاج لوقفة، انت تستطيع أن تستخدم
user=User.find(:first, :conditions =>["name=?", username])
هنا سيرجع أول سجل سيقابله بحيث ان ال name يساوى ال username المطلوب
وتستطيع أيضا أن تستخدم ميزة رائعة
user=User.find_by_name(username)
كيف عرفت أن اسم column بإسم name ؟ هممم راجع ال reflection
*تحديث مستخدم
def update_user(username, newphone)
user=find_user(username)
user.phonenum=newphone
user.save!
end
ستحصل على ال object المطلوب بإستخدام عملية find بإستخدام الدالة التي كتبناها find_user وتعدل عليه وتعمل save! وتم الحفظ فى الجدول
*عرض الكل
def select_all
User.find(:all){|user|
yield user
}
end
هنا لن يتم العرض ولكن سيحصل yield كل record لاستخدامه فى display_user بصورة مناسبة
*حذف
def delete_user(username)
user=find_user(username)
user.destroy
puts "Deleted!"
end
احصل على object واستدعى ال destroy method الخاصة به
*حذف الكل
def delete_all
User.delete_all
end
تستطيع أن تحدد conditions طبعا فى عملية الحذف الجماعى
اخيرا استغل كل مافى الmodule كالتالى مثلا
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
( وبس كدا

)