这一篇主要讲:如何连接到数据库,如何映射表,以及如何处理数据。
ActiveRecord采用了标准的对象-关系映射(ORM)层,表映射到类,记录映射到对象,字段映射到对象的属性。
1,表和类
ActiveRecord会认为表名应该是类名的复数形式,如果类名包含多个大写字母,表名中就应该用下划线分割多个单词,一些特殊的复数形式也会被自动处理。
(DHH的理念:类名应该是单数形式,表名应该是复数形式。为什么这样呢?因为听起来跟符合人命的习惯。我们的目标是创建一种领域语言,让它成为编程语言与口头语言时间的桥梁...如果遵循标准的命名约定,可以省掉大部分的配置。)
如果不喜欢这种方式可以自己设定:
(1)
class user < ActiveRecord:Base
set_table_name "user" #not "users"
end
(2)
class User < ActiveRecord:Base
self.table_name = "user"
end
(3)此外,也可以在配置文件中配置
config.active_record.pluralize_table_names = true|false
如果为false,表名与模型类名一致,而不是后者的复数形式。
2,字段和属性
属性在哪里?数据库结构可以看作模型定义的一部分。
优点:体现了DRY(Don't Repeat Yoursef)原则,如果模型添加一个属性,只需要新建一个数据迁移任务,然后重新加载应用程序,不需要对代码做任何修改。
注意:如果要查询一个boolean型字段的状态,就必须在字段名的后面加问号。
3,主键与Id
在ActiveRecord中,主键字段在对象中的属性名称永远都是id。
primary_key= 声明只是用于指定数据库表中的主键字段。
4, 连接数据库
修改config/database.yml就可以了。
如果有特殊需要,可以用establist_connection方法。
ActiveRecord::Base.establist_connection(
:adapter => "mysql",
:host => "",
:database => "",
:username => "",
:password => ""
)
也可以对某个model用establish_connection
class Customer < ActiveRecord::Base
establist_connection(
:adapter => "mysql",
:host => "",
:database => "",
:username => "",
:password => ""
)
end
5,curd
(1)新增记录
user = User.new
user.name = "wade"
user.save
或
user = User.create(:name => "wade")
save与create的区别?
save和new()搭配使用,create()则同时完成“实例化模型对象”和“将模型对象存入数据库”的操作。
(2)读取现有记录
ActiveRecord如何操作数据库?
动态生成sql语句,底层执行查询操作,把查询结果包装成存放对象的数组
(3)更新现有记录
order = Order.find(123)
order.name = "wade"
order.save
#更新某几个特定字段的值
user = User.find(123)
user.update_attribute(:name,"mengwade')
#用于将来自表单的数据更新到一条已有的数据库记录
user = User.find(123)
user.update_attrubutes(:name => "mengwade",
:email => "[email protected]")
#“读取数据”与“更新数据”合二为一
user = User.update(123,:name => "mengwade",
:email => "[email protected]")
#适用于批量更新,可以指定set和where字句
result = Product.update_all("price=1.1*price","title like '%ruby%'")
(4)删除记录
product.delet(12)
product.delete([12,13])
Product.delete_all(["price > ?",1])
product = Product.find_by_title("ruby")
product.destroy
Product.destroy(12)
Product.destroy([12,13])
Product.destroy_all(["price > ?",100])
d elete()和destroy()的区别?
delete()方法绕过了ActiveRecord的回调和验证,而destroy()可以确保进行模型类中定义的业务规则检查,以保证数据的完整性