【发布时间】:2012-12-13 10:13:47
【问题描述】:
我的理解是表之间的关系是通过外键实现的。但是当您添加模型之间的关联(belongs_to 等)时,数据库架构没有变化。这是为什么? Rails 是如何真正知道存在关联或关系的?
【问题讨论】:
标签: ruby-on-rails model database-schema
我的理解是表之间的关系是通过外键实现的。但是当您添加模型之间的关联(belongs_to 等)时,数据库架构没有变化。这是为什么? Rails 是如何真正知道存在关联或关系的?
【问题讨论】:
标签: ruby-on-rails model database-schema
这里的技巧是,belongs_to、has_one、has_many 仅在数据库中已经存在相应的键时才有效。
密钥通常是<model>_id。
因此,post 和 blog 之间的 belongs_to 关系要求您在您必须使用关系创建的 posts 表中拥有一个 blog_id。
博客和帖子之间的 has_many 也是如此。
class Blog < ActiveRecord::Base
has_many :posts
end
需要在帖子表中创建 blog_id 外键的迁移。
【讨论】:
Rails 将通过仅在模型中提及这些关系来识别所有表之间的关联,但不仅限于外键。如果您不遵循外键的命名约定,即使您在模型中提及关系,rails 也会丢失表之间的关系。然后你必须明确地告诉foreign_key和类名。
class Article < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :article
end
在 cmets 表中,您必须维护 article_id 及其自己的字段。
然后 rails 会自动假定article_id 为foriegn_key。
如果你写别的东西(例如:art_id)而不是article_id,你必须告诉:
class Comment < ActiveRecord::Base
belongs_to :article, :class_name=>"Article", :foreign_key=>:art_id
end
【讨论】:
art_id)而不是article_id,你必须告诉:belongs_to :article, :class_name=>Article, :foreign_key=>:art_id