9

我正在开发一个 Rails 项目(Rails 版本 4.2.3)。我创建了一个UserTask模型,但在创建过程中没有包含它们之间的任何关联。现在我想要一个user 拥有多个tasks,一个task属于一个user

通过这个线程rails g migration AddUserToTask user:belongs_to, 我能够在任务表中插入外部 user_id 键。但是如何添加迁移?我更新了模型:has_manyUser

class User < ActiveRecord::Base
  has_many :customers
end 

但我不确定我必须如何编写迁移。到目前为止,我写了这个:

class addTasksToUser < ActiveRecords::Migration
  def change
    update_table :users do |t|
      t.has_many :tasks
    end 
    add_index :users, taks_id
  end
end 

rake db:migrate没有执行任何操作。这是建立has_many关系的正确方法吗?

4

3 回答 3

23

在模型中设置关联:

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

删除您显示的迁移文件。

添加对tasks表的引用(假设您已经有tasks表):

rails g migration add_references_to_tasks user:references

迁移数据库:

rake db:migrate

如果您还没有tasks表,请创建一个:

rails g migration create_tasks name due_date:datetime user:references # add any columns here

迁移数据库:

rake db:migrate

从现在开始,您的任务将具有user_id属性。

于 2015-07-16T09:43:27.463 回答
1

添加has_many :tasksUser模型和模型belongs_to :userTask。在您的迁移文件中,删除该方法的所有当前主体change并包含add_index :tasks, :user_id一行。之后,正常运行迁移。

于 2015-07-16T09:46:11.660 回答
1

我知道这是一个旧线程,但努力只是为了改进这一点。我认为您要做的是在表中显示参考外键。在这种情况下:

class addTasksToUser < ActiveRecords::Migration   
   def change
     update_table :users do |t|
     t.references :task
   end   
end

请确保您对带有主键的表的引用是单数的。

于 2020-05-09T13:55:54.660 回答