【问题标题】:ruby on rails: why isn't there a migration for every new model association?ruby on rails:为什么每个新模型协会都没有迁移?
【发布时间】:2012-12-13 10:13:47
【问题描述】:

我的理解是表之间的关系是通过外键实现的。但是当您添加模型之间的关联(belongs_to 等)时,数据库架构没有变化。这是为什么? Rails 是如何真正知道存在关联或关系的?

【问题讨论】:

    标签: ruby-on-rails model database-schema


    【解决方案1】:

    这里的技巧是,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 外键的迁移。

    【讨论】:

      【解决方案2】:

      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_idforiegn_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=&gt;Article, :foreign_key=&gt;:art_id
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多