定义Rails模型的外键关系 [英] Defining foreign key relationships for Rails' models
问题描述
class Comment< ActiveRecord :: Base
belongs_to:post,:class_name => 发布,: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.columnpost_id,:integer,:default => 0,:null => false
t.columnauthor,:string,:default => ,:limit => 25,:null => false
t.columnauthor_email,:string,:default => ,:limit => 50,:null => false
t.columncontent,:text,:null => false
t.columnstatus,:string,:default => ,:limit => 25,:null => false
t.timestamps
end
end
def self.down
drop_table:comments
end
end
相反,post_id是一个简单的Integer列。所以,这个外键关系似乎只存在于Rails的头脑中,而不是在数据库级别。
b$ b
这是正确的吗?
另外,相应的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 => 评论,
: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
选项可让您直接设置外键的名称。您的发布
和评论
模型类之间的关联应该如下所示:
class Post< ActiveRecord :: Base
has_many:comments
end
$ b $ class评论< ActiveRecord :: Base
belongs_to:post
end
—注意你不需要:class_name =>在您的
。 Rails已经有了这些信息。当你需要重写Rails约定时,你应该只指定 Comment
模型中显示Post:class_name
和:foreign_key
。
Rails为您维护外键关系是正确的。如果你想添加外键约束,你可以在数据库层中执行它们。
- 我想你会从阅读中受益 ActiveRecord关联指南。
I have a Comment class with a :foreign_key of post_id in the Post class.
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
But my CreateComments migration does not define a database-level foreign key:
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
Instead post_id is a simple Integer column.
So, it seems that this foreign key relationship exists only in the mind of Rails, not at the database level.
Is this correct?
Also, is it necessary for the corresponding Post model to also declare its reciprocal foreign key relationship with Comments using the :foreign_key attribute or could that be omitted?
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
The Rails default behaviour is that the column used to hold the foreign key on a model is the name of the association with the suffix _id
added. The :foreign_key
option lets you set the name of the foreign key directly. The associations between your Post
and Comment
model classes should look like this:
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
end
—Note that you don't need :class_name => "Post"
in your Comment
model. Rails already has that information. You should only be specifying :class_name
and :foreign_key
when you need to override the Rails' conventions.
You're correct that Rails maintains the foreign key relationships for you. You can enforce them in the database layer if you want by adding foreign key constraints.
- I think you would benefit from reading A Guide to ActiveRecord Associations.
这篇关于定义Rails模型的外键关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!