`
jbf034
  • 浏览: 153138 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

列与属性

阅读更多
Active Record 对象对应数据库表中的行。对象的属性对应表中的列。你可能已经注意
到我们定义的Order 类并没有提到orders 表中任何列。这是因为Active Record 是在运行期
间动态决定它们。Active Record 在数据库端的schema 上反射,以配置包装表的类。[这不
是严格的事实,就像一个model 可以有不是schema 的一部分的属性。我们在272 页的下一章
将祥细讨论。]
我们的表orders 可能是如下SQL 语句创建的。
create table orders (
id int not null auto_increment,
name varchar(100) not null,
email varchar(255) not null,
address text not null,
pay_type char(10) not null,
shipped_at datetime null,
primary key (id)
);
我们创建一个包装这个表的Active Record 类。
require 'rubygems'
require_gem 'activerecord'
# Connection code omitted...
class Order < ActiveRecord::Base
end
一旦我们定义了Order 类,我们就可以查询到它包含的属性(列)的信息。下面的代码使
用了columns()方法,它返回一个Column 对象数组。这里我们只显示orders 表的每个列的
名字,通过一个hash 导出shipped_at 这个列的细节。
require 'pp'
pp Order.columns.map { |col| col.name }
pp Order.columns_hash['shipped_at']
当我们运行这段代码时,我们得到以下输出。
["id", "name", "email", "address", "pay_type", "shipped_at"]
#<ActiveRecord::ConnectionAdapters::Column:0x10e4a50
@default=nil,
@limit=nil,
@name="shipped_at",
@type=:datetime>
注意:Active Record 决定每列的类型。在这个例子中,它已经知道数据库中的
shipped_at 列是一个datetime 类型。它将从这个列得到的值存放在Ruby 内的Time 对象中。
我们可以通过写入一个时间字符串到这个属性,然后再取回此内容来验证。你会发现它们返
回的是Ruby 的Time 对象。
order = Order.new
order.shipped_at = "2005-03-04 12:34"
pp order.shipped_at.class
pp order.shipped_at
它会产生:
Time
Fri Mar 04 12:34:00 CST 2005
图14.1 显示了SQL 类型和它们的ruby 表达方式之间的的映射关系。通常这个映射关系
是显而易见的。只有一个潜在的与decimal 列有关的问题。schema 设计者会使用decimal 列
来存储带有固定小数位的数字--decimal 列要求十分精确。Active Record 把decimal 列映射
为Float 类。尽管这对大多数程序是可行的,但是浮点数字是不精确的,如果在这个类型的
属性上执行一系列操作,可能会发生四舍五入的问题。你也可能想使用多个integer 列来替
代,存储货币值的各单元,分,角,元等。另一种做法是使用聚合来构造Money 对象以便分
离数据库的列(dollars 和cents,pounds 和pence,等)。
访问属性
如果一个model 对象有个属性名为balance,你可以使用索引操作符,传递给它一个字
符串或一个符号(symbol)来访问这个属性的值。这儿是我们将使用的符号。
account[:balance] #=> return current value
account[:balance] = 0.0 #=> set value of balance
尽管,在普通编码中不赞成这样使用,但是它可能会减少你的选择,当将来你可能对属
性基础实现进行修改时。相反,你应该访问值或使用Ruby 存取器方法来访问model 属性。
account.balance #=> return current value
account.balance = 0.0 #=> set value of balance
使用这两种技术返回的值,如果可能话将被Active Record 强制转换一个适当的Ruby 类
型(所以,例如,如果数据列是个timestamp,则一个Time 对象将会被返回)。如果你想获得
一个属性的原始值,append_before_type_case 方法返回它的名字,像下面代码显示的。
account.balance_before_type_cast #=> "123.4", a string
account.release_date_before_type_cast #=> "20050301"
最后,在model 本身的代码内部,你可使用read_attribute()和write_attribute()私
有方法。这些接受做为字符串参数的属性的名字。
分享到:
评论

相关推荐

    在PB中如何控制DATAWINDOW列的修改属性

    在 PB 中控制 DATAWINDOW 列的修改属性 在编制管理信息应用系统中,如何控制 DATAWINDOW 列的修改属性是一个共同问题。下面将以一个简单的工资表为例,说明利用 PB 中如何控制 DATAWINDOW 列的修改属性。 一、静态...

    cxgrid动态增加列及属性绑定

    总结,通过以上步骤,我们可以实现CXGrid动态增加列并进行属性绑定,包括与数据源字段的关联,以及设置列的各种属性。同时,对于下拉框功能,可以通过设置`TcxGridColumn.Properties`属性来实现。这使得CXGrid能够...

    自动生成数据表的各列存取属性

    这种自动化生成的存取属性对于数据库驱动的业务逻辑尤其有用,因为它可以确保属性与数据库表保持同步。当数据库结构发生变化时,只需重新运行生成过程,就能快速更新代码。这种方法降低了因手动维护代码而引入错误的...

    sql脚本表所有列的属性查询

    sql语句该表的所有列的属性查询(列入:列中的字段名称, 列的长度, 列的字段类型, 列的字段说明)

    cxGrid的列属性

    `cxGrid`提供了丰富的功能和自定义选项,其中列属性是其核心部分之一,允许开发者对显示的列进行详细配置。这篇文章将深入探讨`cxGrid`的列属性及其相关知识点。 首先,我们来了解`cxGrid`的基本结构。`cxGrid`由多...

    Sql中添加列及列属性的修改脚本

    一个Sql脚本列举了添加列以及修改列属性的代码

    微软数据库管理软件SSMS中在表设计器中显示说明等列属性

    ### 微软数据库管理软件SSMS中在表设计器中显示说明等列属性 #### 背景介绍 在数据库管理领域,SQL Server Management Studio (SSMS) 是一款强大的图形化工具,由微软开发并用于管理和配置 Microsoft SQL Server ...

    mysql增加列修改列名列属性以及删除列.txt

    mysql增加列修改列名列属性以及删除列,mysql增加列修改列名列属性以及删除列,mysql增加列修改列名列属性以及删除列,

    farpoint spread 属性说明

    FrozenColumnCount 属性用于设置控件中的冻结列数。 Column 属性 FpSpread1.ActiveSheetView.Columns[0].Width = 50;//列宽度 Column 属性用于设置控件中的列。在上面的代码中,我们设置了第一个列的宽度为 50...

    CodeSmith的列对象的ExtendedProperty的属性

    根据给定的信息,“CodeSmith的列对象的ExtendedProperty的属性”,我们可以了解到这是一篇关于CodeSmith工具中如何处理数据库表的列属性的文章。CodeSmith是一款强大的代码生成工具,主要用于生成.NET项目的业务层...

    MVVM实现WPF中DataGrid动态列与编辑器

    4. **设置列绑定**:为每列设置Binding,将属性名绑定到列的`DisplayMemberPath`或`Binding.Path`。这使得DataGrid能正确显示数据模型中的值。 5. **编辑模式**:在MVVM中,实现DataGrid的编辑功能通常通过DataGrid...

    VB ListBox多列显示

    而`Columns`属性则是在多列显示时的关键,它允许我们定义列表框中的列数。 要启用多列显示,我们需要设置`ColumnCount`属性,指定所需的列数。例如,如果我们想创建一个3列的ListBox,可以这样写: ```vb ListBox1...

    codesmith7.0获取mysql的表和列的comment属性值

    解决codeSmith7无法获取MySQL的表和列的comment属性值,打开codeSmith安装目录下的\SchemaProviders文件夹,替换相应的SchemaExplorer.MySQLSchemaProvider.dll文件,然后重启codeSmith即可。

    ARCGIS按字段属性输出文件

    针对提供的标题"ARCGIS按字段属性输出文件"和描述,我们可以深入探讨一下这个功能及其应用。 ARCGIS10是ESRI公司推出的一个重要版本,它在数据处理和空间分析方面有显著的提升。在这个特定的场景中,我们关注的是...

    在 Excel 电子表格中列出 AutoCAD 块属性

    本文将详细解析如何利用VBA(Visual Basic for Applications)在Excel电子表格中列出AutoCAD块属性,这一过程涉及到的知识点包括:VBA编程基础、AutoCAD对象模型、Excel VBA集成以及数据处理技术。 ### VBA编程基础...

    JAVA 对于不规则Excel转类和集合

    在常规情况下,Excel数据每一列通常代表一个特定的数据项,与之对应的类属性也相对固定。然而,不规则数据可能意味着某些列的位置可能在不同的工作表或行中变化,或者数据的结构并不完全符合预先定义的类结构。这...

    列元素所用属性之谜.pdf

    此外,列元素(display:table-column)与单元格元素(display:table-cell)的关系是在第三步——排列文档版式时才确定的,而在那之前,每个元素的属性值已经计算完成。 对于 `&lt;col&gt;` 和 `&lt;colgroup&gt;` 的属性问题,...

    使用CSS3多列布局属性.ppt

    使用CSS3多列布局属性.ppt

    JS控制明细列显示隐藏 同时控制字段必填属性.js

    JS控制明细列显示隐藏 同时控制字段必填属性.js

Global site tag (gtag.js) - Google Analytics