zoukankan      html  css  js  c++  java
  • Ruby on rails开发从头来(四十二) ActiveRecord基础(主键和ID)

       也许你已经注意到了,在我们前面的代码中,数据库定义里都使用了一个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属性,其他时候,使用真实的列名。
  • 相关阅读:
    五大常用算法之四:回溯法
    五大常用算法之三:贪心算法
    五大常用算法之二:动态规划算法
    SSH 只能用于远程 Linux 主机?那说明你见识太小了!
    通过Heketi管理GlusterFS为K8S集群提供持久化存储
    php大文件(视频)分片上传
    php大文件(视频)上传讨论
    php大文件(视频)上传分享
    php大文件(视频)上传问题
    php大文件(视频)上传方法
  • 原文地址:https://www.cnblogs.com/dahuzizyd/p/ruby_rails_study_42.html
Copyright © 2011-2022 走看看