The Last Day Of Summer

.NET技术 C# ASP.net ActiveReport SICP 代码生成 报表应用 RDLC
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
   也许你已经注意到了,在我们前面的代码中,数据库定义里都使用了一个integer型的字段id作为主键,这是Active Record的一个约定。

    或许你要问,为什么不用订单编号或者某个有意义的列来作为主键呢?使用id作为主键有一个很重要的原因,就是如果使用具有内在格式的主键的话,随着时间推移,有可能其中的规则也会变化。例如,使用ISBN号码来给book表做主键,毕竟ISBN号码是唯一的,但是,有可能当一本书写完后,美国的出版业已经发展了并且在所有的ISBN号码后又附加了一位数字。

    如果我们使用了ISBN作为book表的主键,我们就要更新所有book表的记录来反映这个变化,而且还有一个问题,还有其他表引用了book表的主键,我们就要更新所有的引用,这还牵涉到要删除外键,所有的这一切都是非常痛苦的。

    如果使用有意义的值作为主键,那么我们将收到外界业务规则的影响,如果使用id,我们可以自己完全控制,而且如果象ISBN等一些东西改变的话,将不会影响到数据库结构。

    如果你从一个新的数据库结构开始,可能会遵循约定,给所有的表都使用id作为主键,但是,当你使用的是一个既存的数据库开始的时候,Active Record提供了简单的方法来让你重新给表指定主键,例如:

class BadBook < ActiveRecord::Base

set_primary_key "isbn"

end

    通常,Active Record会注意给新创建的记录生成主键值-使用自增长的整数。不管怎样,当你override表的主键名字的时候,你就需要自己负责给新建记录一个唯一的主键值。也许有些让人惊讶,你还是设置一个id的属性来完成这件事,因为Active Record所关心的是,主键的设置永远都使用名为id属性,set_primary_key的声明只是设置了使用的列名,下面的例子,我们使用ISBN作为主键。

book = BadBook.new

book.id = "0-12345-6789"

book.title = "My Great American Novel"

book.save

# ...

book = BadBook.find("0-12345-6789")

puts book.title # => "My Great American Novel"

p book.attributes #=> {"isbn" =>"0-12345-6789",

"title"=>"My Great American Novel"}

    也就是说,在设置主键的时候,使用id属性,其他时候,使用真实的列名。