如果我们使用了ISBN作为book表主键我们就要更新所有book表记录来反映这个变化而且还有个问题还有其他表引用了book表主键我们就要更新所有引用这还牵涉到要删除外键所有这切都是非常痛苦
如果使用有意义值作为主键那么我们将收到外界业务规则影响如果使用id我们可以自己完全控制而且如果象ISBN等些东西改变话将不会影响到数据库结构
如果你从个新数据库结构开始可能会遵循约定给所有表都使用id作为主键但是当你使用是个既存数据库开始时候Active Record提供了简单思路方法来让你重新给表指定主键例如:
BadBook < ActiveRecord::Base
_primary_key "isbn"
end
通常Active Record会注意给新创建记录生成主键值-使用自增长整数不管怎样当你override表主键名字时候你就需要自己负责给新建记录个唯主键值也许有些让人惊讶你还是设置个id属性来完成这件事Active Record所关心是主键设置永远都使用名为id属性_primary_key声明只是设置了使用列名下面例子我们使用ISBN作为主键
book = BadBook.
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属性其他时候使用真实列名
最新评论