Rails:理解数据库关系的麻烦

时间:2013-08-13 19:32:16

标签: ruby-on-rails database-migration

所以我想创建三个模型,ProjectEntryUserProject有很多Entries,而User有很多Entries。我使用以下命令搭建了上述三个模型:

rails g scaffold Project title:string

rails g scaffold Entry project:project_id entry_for:user_id created_by:userid \
date:string start_time:string end_time:string total:string type_of_work:string \
on_off_site:string phase:string description:text 

rails g scaffold User name:string

我意识到我可能完全搞砸了我为Entry模型中的其他表手动输入外键的部分。我不知道has_many belongs_to在密钥方面自动化了不同模型之间的关系,所以我尝试手动添加外键字段。这是错的吗?

当我尝试运行db:migrate时,我收到以下错误:

undefined method `user_id' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007fc1bdf37970>

以下是我的迁移,因为我尝试删除所有外键字段但出现上述错误。

class CreateProjects < ActiveRecord::Migration
  def change
    create_table :projects do |t|
      t.string :name

      t.timestamps
    end
  end
end

class CreateEntries < ActiveRecord::Migration
  def change
    create_table :entries do |t|
      t.string :project
      t.string :project_id
      t.user_id :entry_for
      t.user_id :created_by
      t.string :date
      t.string :start_time
      t.string :end_time
      t.string :total
      t.string :type_of_work
      t.string :on_off_site
      t.string :phase
      t.text :description

      t.timestamps
    end
  end
end

class CreateUsers < ActiveRecord::Migration
   def change
    create_table :users do |t|
      t.string :name

      t.timestamps
    end
  end
end

class RemoveColumns < ActiveRecord::Migration
  def self.up
    remove_column :entries, :created_by
    remove_column :entries, :entry_for
    remove_column :entries, :project_id
  end
  def self.down
    add_column :entries, :created_by, :user_id
    add_column :entries, :entry_for , :user_id
    add_column :entries, :project_id, :string
  end
end

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在您的迁移中,您可以尝试t.user_idt.integer而不是t.index。这至少应该让你的迁移运行。

答案 1 :(得分:0)

我将使用t.references entry_for然后在belongs_to :entry_for, class_name: "User"模型中编写Entry作为编写我自己的外键名称的方法。对于project中的entries列,我意识到我可以同样写t.references project