RoR中使用的對象關(guān)系映射是active record。如果你使用過其它的關(guān)系映射,你就會驚嘆ror的對象
關(guān)系映射是如此的簡潔、明了。當(dāng)創(chuàng)建一個(gè)ActiveRecord::Base的子類時(shí)就和數(shù)據(jù)庫中以類名的復(fù)
述形式作為表名的表建立了映射。
類為
class User<< ActiveRecord::Base
end
數(shù)據(jù)庫中的表為
CREATE TABLE `users` (`id` int(10) unsigned NOT NULL auto_increment,
?????? `login` varchar(100) NOT NULL,
???????????????????? `password` varchar(100) NOT NULL,
?????? `email` varchar(100) NOT NULL,
???????????????????? `name` varchar(100) NOT NULL,
??????? PRIMARY KEY? (`id`))
就這樣建立了映射關(guān)系。
你一定很奇怪類User中怎么沒有屬性啊,也沒有象hibernate一樣要指定主鍵id。其實(shí)這一切的奧秘
就是約定,一般情況下數(shù)據(jù)庫中的表要有一個(gè)名為id的主鍵并且是自動(dòng)增長字段。User類中的屬性
將根據(jù)數(shù)據(jù)庫表中的字段動(dòng)態(tài)生成。
突然你發(fā)現(xiàn)你的數(shù)據(jù)庫表和類之間并沒有這樣單復(fù)數(shù)關(guān)系,該怎么辦呢?不用急自有辦法。
你只要在你的類中調(diào)用一個(gè)叫set_table_name的方法就可以了。
class User<< ActiveRecord::Base
?? set_table_name("accounts")
end
就這樣和數(shù)據(jù)中的表“accounts”之間建立的映射。
CREATE TABLE `accounts` (`id` int(10) unsigned NOT NULL auto_increment,
?????? `login` varchar(100) NOT NULL,
???????????????????? `password` varchar(100) NOT NULL,
?????? `email` varchar(100) NOT NULL,
???????????????????? `name` varchar(100) NOT NULL,
??????? PRIMARY KEY? (`id`))
問題總算是解決了.但又發(fā)現(xiàn)了另一問題,表的主鍵并不是id而是user_id。active record有辦法解
決嗎?當(dāng)然是有的了,調(diào)用一個(gè)set_primary_key方法就ok。
class User<< ActiveRecord::Base
?? set_table_name("accounts")
?? set_primary_key("user_id")
end
數(shù)據(jù)庫中的表:
CREATE TABLE `accounts` (`user_id` int(10) unsigned NOT NULL auto_increment,
?????? `login` varchar(100) NOT NULL,
???????????????????? `password` varchar(100) NOT NULL,
?????? `email` varchar(100) NOT NULL,
???????????????????? `name` varchar(100) NOT NULL,
??????? PRIMARY KEY? (`id`))
值得注意的是類中和主鍵對應(yīng)的屬性還是id而不是user_id。
user = User.new
user.id = "00001";
user.save