定义Rails模型的外键关系
在Post类中,我有一个Comment_class:post_id的foreign_key。
class Comment < ActiveRecord::Base belongs_to :post, :class_name => "Post", :foreign_key => "post_id", :counter_cache => true belongs_to :author, :class_name => "User", :foreign_key => "author_id" end
但是,我的CreateComments迁移没有定义数据库级的外键:
class CreateComments < ActiveRecord::Migration def self.up create_table :comments do |t| t.column "post_id", :integer, :default => 0, :null => false t.column "author", :string, :default => "", :limit => 25, :null => false t.column "author_email", :string, :default => "", :limit => 50, :null => false t.column "content", :text, :null => false t.column "status", :string, :default => "", :limit => 25, :null => false t.timestamps end end def self.down drop_table :comments end end
相反,post_id是一个简单的Integer列。
所以,这种外键关系似乎只存在于Rails的思想中,而不是在数据库层面。
它是否正确?
另外,对应的Post模型是否也需要使用:foreign_key属性声明它的相互外键关系,或者可以省略?
class Post < ActiveRecord::Base set_table_name("blog_posts") belongs_to :author, :class_name => "User", :foreign_key => 'author_id' has_many :comments, :class_name => "Comment", :foreign_key => 'post_id', :order => "created_at desc", :dependent => :destroy has_many :categorizations has_many :categories, :through => :categorizations named_scope :recent, :order => "created_at desc", :limit => 5 end
Rails的默认行为是用于在模型上保存外键的列是添加了后缀_id
的关联的名称。 使用:foreign_key
选项可以直接设置外键的名称。 Post
和Comment
模型类之间的关联应该如下所示:
class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end
注意你不需要:class_name => "Post"
在你的Comment
模型。 Rails已经有了这些信息。 你只需要指定:class_name
和:foreign_key
当你需要重写Rails的约定时。
Rails为你维护外键关系是正确的。 如果您想通过添加外键约束,您可以在数据库层中强制执行它们。
- 我想你会从阅读ActiveRecord协会指南中受益。