【问题标题】:has_many association migration in RailsRails 中的 has_many 关联迁移
【发布时间】:2015-10-05 16:09:11
【问题描述】:

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

通过rails g migration AddUserToTask user:belongs_tothis thread 我能够在任务表中插入外部 user_id 键。但是如何添加has_many 迁移?我更新了User 模型:

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 关系的正确方法吗?

【问题讨论】:

  • 你做错了。在模型中添加关联,在迁移中添加对应字段。
  • 只需在模型中添加关联。
  • 对我来说,这个问题的更好答案在这里:stackoverflow.com/a/17928074/4179050

标签: ruby-on-rails ruby-on-rails-4 activerecord ruby-on-rails-5 ruby-on-rails-6


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在模型中设置关联:

    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 属性。

    【讨论】:

    • 嗨,安德雷,感谢您的详细回答。我的任务已经有一个 user_id。我怎样才能让我的用户有很多任务。我很难实现这个方向
    • @theDrifter 如果您的tasks 表已经有user_id 列,那么正如我所说,您只需要确保模型级别的关联(我回答的第一部分)。
    • 嘿@Andrey 谢谢你和我一起生病:)。我确实相应地设置了模型。如何让用户与一组任务相关联并将其转换为我的表结构?
    • 好吧,我弄错了。我没有完全理解 many_to_one 关系。现在我想要属于一个用户的任务。我只是为特定的 user_id 调用任务。我以为我必须将每个 task_id 存储在用户表中,这绝对没有意义:)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多