0

我的印象是,使用 Rails,您不应该在数据库中定义任何依赖项,而只是使用您的 has_many 和 belongs_to 东西来定义关系。但是,我正在浏览rails guide,它有以下内容。

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post

      t.timestamps
    end

    add_index :comments, :post_id
  end
end

我以为这样不行……?我正在尝试做一些类似于评论字段的事情,每次调用 show 方法时都会创建一个新实例,但我认为没有这些“引用”和“add_index”,它不会将 post_id 存储在评论行中。

4

3 回答 3

1

这个迁移所做的就是创建 post_id 并告诉数据库它应该索引这个列(提高性能)

t.references :post和so基本一样t.integer :post_id,是的,就是把post_id存储在comment里面。您仍然需要在模型中定义您的关系。

于 2013-02-12T20:51:03.543 回答
0

你在哲学上实际上是错误的。

Rails 的魔力很好,只有在数据库级别由实际外键支持时。

文档清楚地说明了这一点

当您正确命名外键时,Rails 的魔力就会出现,这样它就可以使用约定来找出关联。

于 2013-02-12T20:53:05.760 回答
0

在 ORM 中表达关系有什么问题,这就是它应该完成的地方。我相信您在数据库供应商细节(例如外键约束和关系)之间混淆了。


class Comment < ActiveRecord::Base
  attr_accessible :post, :post_id
  belongs_to :post
end

class Post < ActiveRecord::Base
  has_many :comments
end

class CommentsController < ApplicationController
  def create
    @comment = Comment.create(params[:comment])  # where params[:comment] = {post_id: 1, message: ''}
    @post = comment.post
    respond_with(@comment)
  end
end
于 2013-02-12T20:56:22.257 回答